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を削除することです。しかし、メディアプレイヤー自体は、この問題を引き起こしている国家ではないかもしれません。理想的には、この井戸はVideocView内で処理されている可能性がありますが、いいえのように見えるかもしれません。

+0

私はすでにstopPlaybackとサスペンドを試みましたが、助けにはなりません。これらは、フラグメントのonDestroyView内で呼び出されます。あなたは私がonDestroyViewの外でこれらのメソッドを呼び出すことを提案していますか? – jay

+0

はい、destroView以外で呼び出すことをお勧めします。この 'getFragmentManager.beginTransaction()。remove(fragmentToBeRemoved).commit();'の違いは、誰かがリソースをクリーンアップするのではなく、順番に明示的にやっている点です。とにかくロバストなシステムはそのようなケースを処理するように設計されていますが、何らかの形でこのケースではそうではありません。試してみる – Dibzmania

0

release()の後にreset()を呼び出すと、これが不正な例外をスローすると思います。

+0

私はそれを明示的にしていないと確信しています。また、上記の問題は4.0.4のみで、上記のバージョンではありません。 – jay

0

このURLに記載されているコードを参照してください。これは実際のアンドロイドgithubリポジトリからのものです。 https://github.com/android/platform_frameworks_base/blob/866658261f4613e17ed6f39a74975ad0c9f40767/media/jni/android_media_MediaPlayer.cpp

Javaからのリセット機能は、このURLのCPPファイルで指定されているネイティブの_reset関数を呼び出します。これは、デバッグできないJNI呼び出しであるため、非常に難しいです。だから私の意見では、あなたが何をしているのか本当に分かっていなければ何がうまくいかないのか知ることは非常に難しいです。

+0

私は何をしているのか正確な詳細を追加しました。上記の問題は4.0.4でのみ発生し、上記のバージョンは発生しません。以下のバージョンではテストしていません。しかし、詳細を追加する必要がある場合はお知らせください、喜んでそうするでしょう。私の優先事項は問題を解決することです。 – jay

関連する問題