Android VideoView setVideoURI阻止UI线程

时间:2014-07-02 10:42:06

标签: android multithreading video-streaming android-videoview

Android中VideoView的setVideoURI方法似乎阻止了UI线程。一旦我称之为这种方法,即使在快速设备上,用户界面也会变得迟钝。有没有办法提高性能? 我可以在这里找到唯一具有该主题的其他主题:
https://groups.google.com/forum/#!topic/android-developers/eAAEAEDcksM
但它已经很老了,并没有令人满意的答案。

4 个答案:

答案 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();

我用过这段代码可能会帮到你