我正在使用我正在处理的应用中的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();
欣赏任何建议,
谢谢,
答案 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引用,每当我创建媒体播放器对象时,都会将其初始化为该静态变量,而我的问题似乎已解决