現在取り組んでいるアプリでMediaPlayerクラスを使用しています。アクティビティの存続期間中、MediaPlayerクラスのインスタンスを保持したいと思います。アクティビティのonPause(){}メソッドでMediaPlayerクラスからリソースを解放していますが、アクティビティが開始すると、LogCatウィンドウに次の警告ポップアップが表示されます。
W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released
ここで私が間違っていることや、この警告を削除する方法はありますか?それは問題を引き起こさないようであり、音はうまく機能します。
状態を管理できるようにいくつかのオブジェクトをラップしたため(MediaPlayerクラスは現在状態情報を提供していません)、他のさまざまな理由で、投稿するコードが多すぎますが、コードはかなり多くなります。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initialiseSounds(this);
}
@Override
protected void onPause()
{
soundManager.releaseResources();
}
@Override
protected void onResume()
{
initialiseSounds(this);
}
このメソッドをSoundManagerクラスで使用すると、次のようになります。
public void releaseResources()
{
player.release();
}
そしてinitialiseSoundsで私はやっています:
MediaPlayer player = new MediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(resourceId);
setDataSource(player, assetFileDescriptor);
トラックを再生したいときは:
player.prepare();
player.start();
アドバイスに感謝します
おかげで、
そのメッセージの出所は完全にはわかりませんが、ここではtwo MediaPlayersを作成していることに注意してください。1つはonCreateに、もう1つはonResumeにあります。
そのメッセージは、MPが「リリース」されることなくファイナライズされている(GCされている)ことは望ましくないことを示しているようです。onCreateで作成した最初のmediaPlayerを参照している可能性があります。 onResumeで再割り当てすると失われます。
MediaPlayerを2つではなく1つだけ作成すれば、おそらくエラーは解消されますか?
このメッセージは、メディアプレーヤーオブジェクトでreleaseを呼び出さず、フラグメントが停止して破棄された場合にも表示されます。
onStop()
または他のメソッドの1つをオーバーライドし、メディアプレーヤーでrelease()を呼び出す必要があります。
@Override
public void onStop() {
super.onStop();
mediaPlayer.stop();
mediaPlayer.release();
}
同様の問題が発生しましたonStart()またはonResumeでメソッドを呼び出します。onCreate()では呼び出さないでください。
私の場合、私はメソッドでローカルメディアプレーヤーの参照を作成しました。私がしたことは、オーディオを再生したいときはいつも、そのメソッドを使用していたということです。しかし、突然、ローカル変数がメモリから消去され、その参照でMediaPlayerにアクセスできなくなることがわかりました。
次に、1つのグローバルな静的Mediaplayer参照を作成し、メディアプレーヤーオブジェクトを作成するたびに、それをその静的変数に初期化して、問題が解決したようです