Android中VideoView的setVideoURI方法似乎阻止了UI线程。一旦我称之为这种方法,即使在快速设备上,用户界面也会变得迟钝。有没有办法提高性能?
我可以在这里找到唯一具有该主题的其他主题:
https://groups.google.com/forum/#!topic/android-developers/eAAEAEDcksM
但它已经很老了,并没有令人满意的答案。
答案 0 :(得分:2)
我所做的是将setVideoUri()方法放入带有looper的处理程序中,即
new Handler(Looper.myLooper()).post(new Runnable(){
@Override
public void run(){
videoview.setVideoUri("uri");
}
});
这会在主UI线程之外运行代码,但会将其保存在looper中,以便可以执行代码而不会抛出异常
答案 1 :(得分:1)
VideoView.setVideoURI()启动一个新的线程进行媒体播放,但它是媒体解码部分,会导致额外的延迟。唯一可能适合你的解决方案是使用一些NDK黑客,但对我来说不值得
答案 2 :(得分:0)
我发现VideoView没有阻止UI线程。实际上在阻止UI线程的“android.media.VOLUME_CHANGED_ACTION”接收器中。
我的问题代码:
public void setVolume(int volume) {
try {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
ivVoice.setTag(volume != 0);
updateVoiceImage();
} catch (Exception e) {
e.printStackTrace();
}
}
从音量接收器调用setVolume,在播放5s mp4时调用了1000次以上。
audioManager.setStreamVolume 在主线程中花费的时间过长。
解决方案代码:
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();
}
}
所以,请检查您的音量接收器。也许它可以帮助你。
答案 3 :(得分:-1)
VideoView myVideoView = (VideoView)findViewById(R.id.myvideoview);
myVideoView.setVideoURI(Uri.parse(url));
myVideoView.setMediaController(new MediaController(this));
myVideoView.requestFocus();
myVideoView.start();
我用过这段代码可能会帮到你