25

現在作業中のアプリで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();

アドバイスに感謝します、

ありがとう、

4

4 に答える 4

26

そのメッセージの発信元は完全にはわかりませんが、ここでは2つのMediaPlayerを作成していることに注意してください。1つはonCreateに、もう1つはonResumeにあります。

そのメッセージは、MPが「リリース」されずにファイナライズ(GC)されることを好まないことを示しているようです。onCreateで作成した最初のmediaPlayerを参照している可能性があります。これは、onResumeで再割り当てした後に失われます。

MediaPlayerを2つではなく1つだけ作成すると、エラーがなくなる可能性がありますか?

于 2012-09-25T21:01:14.767 に答える
7

このメッセージは、メディアプレーヤーオブジェクトでreleaseを呼び出さず、フラグメントが停止されて破棄された場合にも表示されます。

onStop()または他のメソッドの1つをオーバーライドして、メディアプレーヤーでrelease()を呼び出す必要があります。

@Override
public void onStop() {
    super.onStop();
    mediaPlayer.stop();
    mediaPlayer.release();
}
于 2016-11-10T08:34:26.727 に答える
5

私の場合、メソッドでローカルメディアプレーヤーの参照を作成しました。私が行ったことは、そのメソッドを使用していたオーディオを再生したいときはいつもということでした。しかし、突然、そのローカル変数がメモリから削除され、その参照でMediaPlayerにアクセスできなくなることがわかりました。

次に、1つのグローバル静的Mediaplayer参照を作成し、メディアプレーヤーオブジェクトを作成するたびに、その静的変数に初期化しました。問題は解決したようです。

于 2019-12-08T09:22:43.967 に答える
2

同様の問題が発生しました。onStart()またはonResumeでメソッドを呼び出します。onCreate()では呼び出さないでください。

于 2014-09-04T08:54:47.700 に答える