Il metodo setVideoURI di VideoView in Android sembra bloccare il thread dell'interfaccia utente. Non appena chiamo questo metodo, l'interfaccia utente diventa stanca, anche su dispositivi veloci. C'è un modo per migliorare le prestazioni qui? L'unico altro thread con quell'argomento che ho trovato qui:
https://groups.google.com/forum/#!topic/android-developers/eAAEAEDcksM
ma è piuttosto vecchio e non ha una risposta soddisfacente.Android VideoView setVideoURI blocca thread UI
risposta
VideoView myVideoView = (VideoView)findViewById(R.id.myvideoview);
myVideoView.setVideoURI(Uri.parse(url));
myVideoView.setMediaController(new MediaController(this));
myVideoView.requestFocus();
myVideoView.start();
Ho usato questo codice può vi aiuterà a
In che modo dovrebbe aiutarmi? Sto già utilizzando la chiamata setVideoURI e questa è la causa dei miei problemi di prestazioni – Alf
VideoView.setVideoURI() avvia un nuovo thread per la riproduzione multimediale, ma è la parte di decodifica multimediale che provoca più unica soluzione delay.The che potrebbero essere ok per voi è utilizzando alcuni hack NDK, ma non meriti per me
In realtà mi risulta che quando la connessione a Internet è lenta, il blocco diventa molto più grave. Ciò direbbe che la decodifica è l'unica fonte dei ritardi. O c'è una spiegazione del perché la decodifica dei media bloccherebbe di più su una cattiva connessione? – Alf
Non sono sicuro, dipende da cosa stai facendo in source, ma se la connessione è lenta, il decoder ha più personale da fare, perché calcola e fa ripetutamente operazioni che di solito non funzionano perché il buffer è cancellato tra l'attesa sui pacchetti –
Quello che ho fatto è stato posto il metodo setVideoUri() in un gestore con un looper cioè
new Handler(Looper.myLooper()).post(new Runnable(){
@Override
public void run(){
videoview.setVideoUri("uri");
}
});
questo esegue il codice all'esterno del thread principale dell'interfaccia utente, ma lo mantiene in un looper in modo che il codice possa essere eseguito senza generare un'eccezione
Ho riscontrato che VideoView non blocca il thread dell'interfaccia utente. In realtà nel ricevitore di "android.media.VOLUME_CHANGED_ACTION" che blocca il thread dell'interfaccia utente.
Il mio codice problema:
public void setVolume(int volume) {
try {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
ivVoice.setTag(volume != 0);
updateVoiceImage();
} catch (Exception e) {
e.printStackTrace();
}
}
setVolume chiamato dal ricevitore volume, ha chiamato 1000 volte durante la riproduzione di un mp4 5s.
audioManager.setStreamVolume richiede troppo tempo nella thread principale.
codice della soluzione:
public void setVolume(int volume) {
try {
//if volume not changed , do nothing.
if(volume != lastVolume){
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,volume,0);
ivVoice.setTag(volume != 0);
updateVoiceImage();
lastVolume = volume;
}
} catch (Exception e) {
e.printStackTrace();
}
}
Quindi, si prega di controllare il ricevitore del volume. Forse può aiutarti.
- 1. VideoView con cookie (o intestazioni)
- 2. Android VideoView ripetizione
- 3. Editing VideoView Android incornicia
- 4. android - chiamata il thread ui dal thread di lavoro
- 5. Differenza tra thread UI e thread di lavoro in Android?
- 6. Thread si blocca su WifiManager.enableNetwork()
- 7. VideoView Android salva stream RTSP
- 8. Android TextureView vs VideoView Performance
- 9. VideoView & Fullscreen & Modifiche all'orientamento - Android
- 10. Task continuation blocking UI thread
- 11. sincronizza thread - no UI
- 12. NSURLConnection blocca il thread principale?
- 13. Thread.join blocca il thread principale
- 14. NSFileManager removeItemAtPath blocca thread principale
- 15. Il thread principale è lo stesso del thread UI?
- 16. Ridimensiona VideoView
- 17. Android: Accesso UI Element dal thread del timer
- 18. Android AsyncTask onPostExecute off del thread ui principale
- 19. Android - SQLite ContentResolver inserisce/elimina/aggiorna sul thread UI?
- 20. Qt: thread UI di aggiornamento thread di thread
- 21. Sincronizzazione operatore con thread UI
- 22. Rxjava AndroidSchedulers.mainThread() significa thread UI?
- 23. Accesso UI in un thread
- 24. .Net perché Threading.Task.Task blocca ancora la mia UI?
- 25. Ottieni il mediaPlayer del videoView in Android
- 26. Android 4.1 - RTSP utilizzando VideoView e MediaController
- 27. Errore Android MediaPlayer/VideoView (1, -2147483648)
- 28. Android: può AsyncTask restituire in un altro thread rispetto al thread UI?
- 29. API Google Drive await() Errore thread UI
- 30. "Attendi Task.Delay (1000)" blocca ANY thread?
setVideoURI sembra chiamare internamente mMediaPlayer.prepareAsync(), quindi dovrebbe solo tornare senza bloccare ma non lo fa. Quindi passare a MediaPlayer da VideoView non sarebbe utile. – Alf
Hai provato a inserire il codice all'interno di un asynctask? –
Succede ogni volta che chiami 'setVideoUri()'? O solo dalla seconda volta in poi? – matiash