【问题标题】:Releasing Media Player while preparing is causing app to freeze准备时释放媒体播放器导致应用程序冻结
【发布时间】:2016-06-18 20:47:41
【问题描述】:

我有两个活动,一个具有 Recyclerview 的主要活动和一个 detailActivity,每次用户单击 Recyclerview 的一个项目时都会启动它。 detailActivity 有一个 mediaplayer 组件,每次创建 detailActivity 时都会创建该组件。现在在 onDestroy 方法中,我总是通过这段代码释放 mediaPlayer 占用的资源:

@Override
 protected void onDestroy() {
    if (mMediaPlayer != null) {
        if (mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();}

        mMediaPlayer.release();
        mMediaPlayer=null;
    }


    super.onDestroy();
}

每当我在媒体播放器仍在准备时单击返回按钮时,应用程序都会冻结一段时间。我在 logcat 中得到的消息是这样的:

I/Choreographer: Skipped 112 frames!  The application may be doing too much work on its main thread.

所以只有当我在准备时销毁活动时才会发生这种冻结,但如果它已经处于准备状态,则不会发生。我使用 prepreAsync 从互联网上获取媒体。 谢谢。非常感谢任何帮助。我被这个问题困扰了好几天!

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    好的。我已经解决了这个问题。我正在为任何可能遇到与我相同情况的人写这篇文章。我在类的范围内创建了两个布尔标志,如下所示:

     boolean prepared = false;
     boolean cancel = false;
    

    之后在 onpreapred 方法中我将prepare设置为true。

    mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
    
                prepared = true;
    
            }
        });
    

    在 onDestroy 方法中,我检查媒体播放器是否已经准备好,如果准备好了,我将其从方法中释放出来。

    @Override
    protected void onDestroy() {
        if (mMediaPlayer != null) {
            if (mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
            }
        if (prepared) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
            cancel = true;
    
        }
    
    
        super.onDestroy();
    }
    

    否则,我将取消设置为 true 并在 OnBufferingUpdateListener 接口上实现并覆盖其方法并从那里释放媒体播放器。

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
    
        if (cancel) {
            mp.reset();
            mp.release();
            mMediaPlayer = null;
            Log.i("msg", " mp released");
        }
    }
    

    【讨论】:

      【解决方案2】:

      尝试取消重新检查媒体播放器是否正在运行。

      @Override
      protected void onDestroy() {
        if (mMediaPlayer != null) {
          mMediaPlayer.stop();
          mMediaPlayer.release();
        }
        super.onDestroy();
      }
      

      如果仍然发生,请尝试删除 onDestroy() 中的检查媒体播放器。

      -- 更新--

      这可能与此错误有关:
      https://code.google.com/p/android/issues/detail?id=959

      这可能会有所帮助:
      Android MediaPlayer reset freezes UI

      【讨论】:

      • 感谢您的回答。我已经尝试过了,但它不起作用。我相信问题出在准备过程中的某个地方。在准备过程中突然破坏活动是造成这种情况的原因。不过我还不知道怎么解决。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多