4

我有一个包含VideoView和其他几个视图的片段。删除4.0.4包含videoView的片段时出错

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异常被抛出仅限搭载Android 4.0.4(与上述版本4.0.4没有问题)。

以下是例外:

java.lang.IllegalStateException 
    at android.media.MediaPlayer._reset(Native Method) 
    at android.media.MediaPlayer.reset(MediaPlayer.java:1236) 
    at android.widget.VideoView.release(VideoView.java:549) 
    at android.widget.VideoView.access$2300(VideoView.java:49) 
    at android.widget.VideoView$6.surfaceDestroyed(VideoView.java:537) 
    at android.view.SurfaceView.updateWindow(SurfaceView.java:581) 
    at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:290) 
    at android.view.View.dispatchDetachedFromWindow(View.java:9823) 
    at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2266) 
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3588) 
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3568) 
    at android.view.ViewGroup.removeView(ViewGroup.java:3516) 
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:951) 
    at android.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1123) 
    at android.app.BackStackRecord.run(BackStackRecord.java:592) 
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1382) 
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426) 
    at android.os.Handler.handleCallback(Handler.java:605) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4424) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 

这是我如何删除片段:

getFragmentManager.beginTransaction().remove(fragmentToBeRemoved).commit(); 

是什么原因造成这种IllegalStateException异常,如何解决这个问题?任何指向解决方案的东西都会有很大的帮助。

+0

为什么要删除的片段,我的意思是,你可以简单地与其他片段 –

+0

你应该提供一个[MCVE]希望找到你的问题的一个明确的答案取代。在这里,我们只有破坏部分。 – AxelH

回答

2

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

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

由于从堆栈跟踪是显而易见的,当你删除的片段,什么Android为是去除VideoView(这毕竟是一个视图),这导致Videoview试图以释放潜在的媒体播放器。但Mediaplayer本身可能不是一个可能会导致此问题发布的状态。理想的情况是这口井可能是内VideocView处理,但看起来像没有

+0

我已经尝试过stopPlayback并暂停,但它们没有帮助。这些在片段的onDestroyView中调用。你是否建议我在onDestroyView之外调用这些方法? – jay

+0

是的,我建议你在destroView之外调用它们。 getFragmentManager.beginTransaction()。remove(fragmentToBeRemoved).commit();调用它们的区别在于,不是某个人在清理资源时,而是按顺序显式执行它们。无论如何,强大的系统都是为了处理这种情况而设计的,但在某些情况下,它不会。试一试 – Dibzmania

0

我想你在release()之后调用reset()并抛出非法状态异常。

+0

我很确定我没有明确地这样做。此外,我仅在4.0.4版本中遇到上述问题,而不是上述任何版本。 – jay

0

请参阅此URL上给出的代码。这是从实际的Android github回购。 https://github.com/android/platform_frameworks_base/blob/866658261f4613e17ed6f39a74975ad0c9f40767/media/jni/android_media_MediaPlayer.cpp

从Java复位函数调用这是在CPP文件中给出的这个URL,这是很难调试,因为它是一个JNI调用不能调试本地_reset功能。所以在我看来,除非我们真的知道你到底在做什么,否则很难知道发生了什么问题。

+0

我已经添加了关于我在做什么的确切细节。上述问题仅在4.0.4版本中出现,而不是上述任何版本。尚未针对以下版本进行测试。但是,请让我知道是否需要添加更多细节,将很高兴地这样做。我的首要任务是解决问题。 – jay