Android:MediaPlayer未经发布而最终确定

mag*_*tte 16 android android-mediaplayer

我正在使用我正在处理的应用程序中的MediaPlayer类.我希望在我的Activity的生命周期中保留一个MediaPlayer类的实例.我正在活动的onPause(){}方法中释放MediaPlayer类中的资源,但是当活动开始时,我会在LogCat窗口中弹出以下警告:

W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released
Run Code Online (Sandbox Code Playgroud)

知道我在这里做错了什么或如何删除此警告?它似乎没有引起任何问题,声音效果很好.

我有一些太多的代码要发布,因为我包装了一些对象以允许管理状态(MediaPlayer类当前不提供状态信息),以及其他各种原因,但代码非常多:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    initialiseSounds(this);
}

@Override
protected void onPause()
{
    soundManager.releaseResources();
}

@Override
protected void onResume()
{
    initialiseSounds(this);
}
Run Code Online (Sandbox Code Playgroud)

在我的SoundManager类中使用此方法:

public void releaseResources()
{
    player.release();
}
Run Code Online (Sandbox Code Playgroud)

在初始化声音我正在做:

MediaPlayer player = new MediaPlayer();
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
AssetFileDescriptor assetFileDescriptor = context.getResources().openRawResourceFd(resourceId);
setDataSource(player, assetFileDescriptor);
Run Code Online (Sandbox Code Playgroud)

当我想播放曲目时,我会:

player.prepare();
player.start();
Run Code Online (Sandbox Code Playgroud)

感谢任何建议,

谢谢,

Tim*_*Tim 20

我不完全确定该消息的来源,但请注意,您正在创建两个 MediaPlayers:一个在onCreate中,另一个在onResume中.

该消息似乎表明它不喜欢MP正在最终确定(GC'd)而不被'释放'.它可能指的是您在onCreate中创建的第一个mediaPlayer,它在onResume中重新分配后丢失.

如果你只创建一个MediaPlayer而不是两个,那么错误可能会消失?


Las*_*mal 11

就我而言,我在一个方法中创建了本地媒体播放器引用,我所做的是,当我想播放一些音频时,我一直使用该方法。但后来我发现突然间该局部变量将从内存中清除,并且无法再通过该引用访问 MediaPlayer 。

然后我创建了一个全局静态 Mediaplayer 引用,当我创建一个媒体播放器对象时,我将其初始化为该静态变量,我的问题似乎得到了解决


Dhi*_*pta 7

如果您不在媒体播放器对象上调用 release 并且您的片段被停止并销毁,也会出现此消息。

您需要覆盖onStop()或其他方法之一并在媒体播放器上调用 release() 。

@Override
public void onStop() {
    super.onStop();
    mediaPlayer.stop();
    mediaPlayer.release();
}
Run Code Online (Sandbox Code Playgroud)