Android:MediaPlayer 未发布就完成了

Posted

技术标签:

【中文标题】Android:MediaPlayer 未发布就完成了【英文标题】:Android: MediaPlayer finalized without being released 【发布时间】:2012-09-17 09:53:46 【问题描述】:

我在当前正在开发的应用程序中使用 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();

感谢任何建议,

谢谢,

【问题讨论】:

您能否在 onCreate/onResume/onPause 等中包含您对媒体播放器所做的相关代码 sn-ps? “释放资源”的解释可能有些含糊。 @Tim Hi Tim,我已经在问题中添加了一些代码,谢谢! 这个答案救了我***.com/a/59234021/5773037 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我的荣幸! tnx 投票给兄弟...@NikunjParadva 我一直很感激那个对我有帮助的答案。 谢谢先生!这正是问题所在! 我的快乐伙伴...叫我 Lasitha。【参考方案4】:

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

【讨论】:

以上是关于Android:MediaPlayer 未发布就完成了的主要内容,如果未能解决你的问题,请参考以下文章

android Mediaplayer

媒体播放器文件未找到异常

Android - MediaPlayer/SoundPool 性能?

Android:MediaPlayer - 免提音量

如何在android中静音MediaPlayer

Android中的MediaPlayer和VideoView有啥区别