小编wil*_*rmo的帖子

Android 媒体播放器保留应用程序实例并导致内存泄漏

我有一个媒体播放器作为成员变量的活动。

我的媒体播放器是这样初始化的:

mMediaPlayer = new MediaPlayer(); 
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(MyActivity.this, URL); 
mMediaPlayer.prepareAsync(); 
//i set a on Prepared Listener to start playing on Prepared
Run Code Online (Sandbox Code Playgroud)

一切正常,然后我覆盖我的活动 onStop 方法以释放媒体播放器。

if(mMediaPlayer!=null){
   if(mMediaPlayer.isPlaying()){
       mMediaPlayer.stop();
   }
   mMediaPlayer.release();
   mMediaPlayer=null;
}
Run Code Online (Sandbox Code Playgroud)

但是在活动停止后,我从 LeakCanary 收到了内存泄漏报告。

报告是这样的:

MyApp.Instance->

MyApp.mLoadedApk->

LoadedApk.mReceivers->

ArrayMap.mArray->

arrayObject[].[3]->

ArrayMap.mArray->

arrayObject[][0]->

MediaPlayer.mProxyReceiver->

MediaPlayer.mProxyContext->

leaks MyActivity instance.

MyApp.Instance->

MyApp.mLoadedApk->

LoadedApk.mReceivers->

ArrayMap.mArray->

arrayObject[].[3]->

ArrayMap.mArray->

arrayObject[][0]->

MediaPlayer.mProxyReceiver->

MediaPlayer.mProxyContext->

leaks MyActivity instance.
Run Code Online (Sandbox Code Playgroud)

是的,我有一个扩展 Application 的 MyApp 类,并且我在静态字段中持有对 MyApp 实例的引用,但我从未在我的活动中使用该引用,我该如何解决这个泄漏?

[编辑]

这是我的活动代码:

public class PlayActivity extends ActionBarActivity {

private MediaPlayer mediaPlayer;
@Override
protected void …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks android-mediaplayer leakcanary

5
推荐指数
1
解决办法
3453
查看次数