2016-06-18 14 views
1

私は2つのアクティビティにRecyclerviewと、Recyclerviewの項目の1つをクリックするたびに起動されるdetailedActivityを持っています。 detailedActivityには、detailedActivityが作成されるたびに作成されるmediaplayerコンポーネントがあります。今onDestroy方法で私はいつも、このコードでのMediaPlayerで撮影されたリソースを解放:準備中にメディアプレーヤーを解放するとアプリがフリーズする

@Override 
protected void onDestroy() { 
    if (mMediaPlayer != null) { 
     if (mMediaPlayer.isPlaying()) { 
      mMediaPlayer.stop();} 

     mMediaPlayer.release(); 
     mMediaPlayer=null; 
    } 


    super.onDestroy(); 
} 

アプリはしばらくの間、メディアプレーヤがまだ準備している間、私は戻るボタンをクリックするたびにフリーズします。それが準備している間、私は活動を破壊したが、それは既に準備済み状態の場合には発生しません場合

I/Choreographer: Skipped 112 frames! The application may be doing too much work on its main thread. 

したがって、この凍結が起こるのみ:私はlogcatに入るメッセージはこれです。私はprepreAsyncを使ってインターネットからメディアを取得します。おかげさまで どんな助けも高く評価されます。私は数日間この問題に立ち往生してきました!

答えて

0

OK。私はこの問題を解決するように努力してきました。私はこれと同じ状況に遭遇する可能性のある人のためにこれを書いています。私がtrueに準備された設定onpreapred方法でその後

boolean prepared = false; 
boolean cancel = false; 

:私はこのようなクラスのスコープ内で2つのブール旗を作りました。私はこの方法自己からそれを解放用意している場合メディアプレーヤがすでに準備されているかどうかを確認しonDestroy方法で

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
     @Override 
     public void onPrepared(MediaPlayer mp) { 

      prepared = true; 

     } 
    }); 

@Override 
protected void onDestroy() { 
    if (mMediaPlayer != null) { 
     if (mMediaPlayer.isPlaying()) { 
      mMediaPlayer.stop(); 
     } 
    if (prepared) { 
      mMediaPlayer.release(); 
      mMediaPlayer = null; 
     } 
     cancel = true; 

    } 


    super.onDestroy(); 
} 

そうでなければ、私がtrueにキャンセルとOnBufferingUpdateListenerインターフェイス上で実装し、そのメソッドをオーバーライドして、そこからのMediaPlayerを解放する設定します。

@Override 
public void onBufferingUpdate(MediaPlayer mp, int percent) { 

    if (cancel) { 
     mp.reset(); 
     mp.release(); 
     mMediaPlayer = null; 
     Log.i("msg", " mp released"); 
    } 
} 
1

mediaplayerが実行中かどうかを再確認してください。

@Override 
protected void onDestroy() { 
    if (mMediaPlayer != null) { 
    mMediaPlayer.stop(); 
    mMediaPlayer.release(); 
    } 
    super.onDestroy(); 
} 

それでも問題が解決しない場合は、onDestroy()のmediaplayerのチェックを外してみてください。

- UPDATE -

これは、このバグに関連することができます。これは助けとなる可能性が
https://code.google.com/p/android/issues/detail?id=959


Android MediaPlayer reset freezes UI

+0

ありがとうございました。私はそれを試みましたが、それは動作していません。問題は準備中のどこかにあると私は信じている。準備中の突然の活動の破壊は、これを引き起こしています。私はまだそれを解決する方法を知らない。 –

+0

これはバグかもしれません。私の更新された答えをお読みください。 –

関連する問題