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

时间:2012-09-25 20:19:50

标签: android android-mediaplayer

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

W/MediaPlayer-JNI(16795): MediaPlayer finalized without being released

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

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

@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();
}

在初始化声音中我正在做:

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 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:4)

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

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

@Override
public void onStop() {
    super.onStop();
    mediaPlayer.stop();
    mediaPlayer.release();
}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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