【问题标题】:Android: MediaPlayer finalized without being releasedAndroid:MediaPlayer 未发布就完成了
【发布时间】: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,我已经在问题中添加了一些代码,谢谢!

标签: android android-mediaplayer


【解决方案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() 中调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 1970-01-01
        相关资源
        最近更新 更多