在4.0.4中删除包含videoView的片段时出错

时间:2017-01-17 14:32:18

标签: android android-fragments android-videoview android-4.0-ice-cream-sandwich illegalstateexception

我有一个包含VideoView和其他一些视图的片段。

user register

每当我在播放视频时删除此片段时,仅在Android 4.0.4中抛出IllegalStateException(4.0.4以上版本没有问题)。

以下是例外:

kernel stack

这就是我删除片段的方法:

public class PlayerPane extends Fragment { 
    ... // static variables
    private ImageView imageView;
    private ImageView gifView;
    private VideoView videoView;
    private WebView webView;
    private PDFView pdfView;
    private MyScrollTextView scrollTextView;
    private MediaPlayer audioPlayer;
    ...

    @Override
    public void onDestroyView() {
        if (videoView != null && videoView.isPlaying()) {
            LOGGER.info("Stopping videoView");
            videoView.stopPlayback();
            videoView.suspend();
            videoView = null;
        }
        super.onDestroyView();
    }

导致此IllegalStateException的原因是什么?如何解决此问题? 任何指向解决方案的东西都会有很大的帮助。

3 个答案:

答案 0 :(得分:2)

我建议你采取不同的方法。删除片段之前。在尝试删除片段之前调用此代码。

videoView.stopPlayback();
videoView.suspend();

从堆栈跟踪中可以看出,当您删除片段时,Android所做的就是删除VideoView(毕竟它是一个视图),这会导致Videoview尝试释放底层的Mediaplayer。但Mediaplayer本身可能不是一个导致这个问题的被释放的州。理想情况下,这个井可能已在VideocView中处理,但看起来没有

答案 1 :(得分:0)

我认为你在release()之后调用reset(),这会抛出illegalstateexception。

答案 2 :(得分:0)

请参阅此网址上提供的代码。这是来自实际的android github repo。 https://github.com/android/platform_frameworks_base/blob/866658261f4613e17ed6f39a74975ad0c9f40767/media/jni/android_media_MediaPlayer.cpp

java中的reset函数调用本URL中CPP文件中给出的native _reset函数,这很难调试,因为它是一个无法调试的JNI调用。所以在我看来,除非我们真正知道你在做什么,否则很难知道出了什么问题