2014-07-02 38 views
5
Android'de VideoView arasında setVideoURI yöntemi UI iş parçacığı engelleme gibi görünüyor

. Bu yöntemi çağırır duymaz, UI'nin hızlı aygıtlarda bile dolanması. Performansı iyileştirmenin bir yolu var mı? bu konu ile diğer tek iplik burada bulabiliriz:
https://groups.google.com/forum/#!topic/android-developers/eAAEAEDcksM
ama oldukça eski ve tatmin edici bir cevap yoktur.Android VideoView setVideoURI blokları UI iş parçacığı

+0

setVideoURI sadece engellemeden dönmelidir, böylece içten) mMediaPlayer.prepareAsync (call görünüyor ama öyle değil. Bu nedenle VideoView’den MediaPlayer’a geçiş yapmak da yardımcı olmaz. – Alf

+0

bir asynctask içine kodunuzu koymak denediniz mi? –

+3

Bu, setVideoUri() 'yi her çağırdığınızda gerçekleşir mi? Ya da sadece ikinci defadan itibaren mi? – matiash

cevap

-1
VideoView myVideoView = (VideoView)findViewById(R.id.myvideoview); 
myVideoView.setVideoURI(Uri.parse(url)); 
myVideoView.setMediaController(new MediaController(this)); 
myVideoView.requestFocus(); 
myVideoView.start(); 

i medya oynatma için yeni bir iş parçacığı başlatır size

+1

Bu bana hangi şekilde yardım etmeli? Zaten setVideoURI aramasını kullanıyorum ve bu benim performans sorunlarımın sebebi de bu. – Alf

1

VideoView.setVideoURI() yardımcı olacaktır olabilir bu kodu kullanılan, ama olabilir ekstra delay.The sadece çözümü neden medya çözme parçasıdır bazı NDK kesmek kullanıyor için Tamam olabilir ama ben bir işleyici içine setVideoUri() yöntemi olduğu yeri ne yaptık bana

+0

Aslında internet bağlantısının yavaş olması durumunda engellemenin çok daha şiddetli olduğunu görüyorum. Bu, kod çözmeye karşı gecikmelerin tek kaynağıdır. Ya da medya kod çözmenin neden bozuk bir bağlantıda daha fazla engelleneceğine dair bir açıklama var mı? – Alf

+0

Gerçekten emin değilim, kaynakta ne yaptığınıza bağlı olarak, ancak bağlantı yavaşsa, kod çözücünün daha fazla personeli olması gerekir, çünkü genellikle arabellek beklemenin arasında arabelleğin temizlenmemesinden kaynaklanan işlemleri tekrar eder ve yapar paketlerde –

2

için değil worths yapan bir ilmek yani

new Handler(Looper.myLooper()).post(new Runnable(){ 
    @Override 
    public void run(){ 
     videoview.setVideoUri("uri"); 
    } 
}); 

Bu ana UI iş parçacığı dışında kod çalışır, ancak kod ben VideoView UI iş parçacığı engelleme değil bulduk

0

istisna atma olmadan çalıştırılabilir, böylece bir sancı durmaya devam eder. Aslında "android.media.VOLUME_CHANGED_ACTION" kullanıcı arabiriminde engelleme alıcısında.

Benim sorunum kodu: hacim alıcısından denilen

public void setVolume(int volume) { 
    try { 
     audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); 
     ivVoice.setTag(volume != 0); 
     updateVoiceImage(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

setVolume, bu çağırdı 1000+ kez 5s mp4 oynarken. Ana iş parçacığı çok uzun sürüyor.

audioManager.setStreamVolume

çözüm kodu:

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(); 
    } 

} 

Yani, hacim alıcısını kontrol edin. Belki size yardımcı olabilir.

İlgili konular