25

我正在我目前正在开发的应用程序中使用 MediaPlayer 类。我想在 Activity 的整个生命周期中保留 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

I'm not completely sure of the origin of that message, but notice here that you're creating two MediaPlayers: one in onCreate and one in onResume.

That message seems to indicate that it doesn't like that a MP is being finalized (GC'd) without being 'released'. It may be referring to that first mediaPlayer you create in onCreate, which is lost after you reassign it in onResume.

Perhaps the error will go away if you only create one MediaPlayer instead of two?

于 2012-09-25T21:01:14.767 回答
7

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

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

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

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

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

于 2019-12-08T09:22:43.967 回答
2

我遇到过类似的问题 在 onStart() 或 onResume 中调用方法,不要在 onCreate() 中调用。

于 2014-09-04T08:54:47.700 回答