繁体   English   中英

启动活动内存泄漏

[英]Startup Activity Memory Leak

我有一个名为StartupActivity的简单活动,它在应用程序启动时播放,并有意地打开MainActivity。 我注意到,如果我更改清单以直接向MainActivity打开,则我的应用程序在MainActivity上使用的内存将减少7mb或更多。 我相信这是内存泄漏。 不过我找不到,有人可以帮我吗

 public class StartupActivity extends Activity {

private MediaManager mp;
private CountDownTimer time;
private boolean activityHasExited;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.activity_startup);
    activityHasExited=false;

    mp = new MediaManager();
    mp.playSoundClip(this,R.raw.intro);
    //display the logo 
    time = new CountDownTimer(4000,1000){
        @Override
        public void onTick(long millisUntilFinished){
        } 

        @Override
        public void onFinish(){
            if(!activityHasExited){
                Intent i= new Intent(StartupActivity.this, MainActivity.class);
                startActivity(i);
                time=null;
                StartupActivity.this.finish();
            }
        }
   }.start();
}

@Override
public void onDestroy(){
    super.onDestroy();

    if(time!=null){
        time.cancel();
        time=null;
    }
    mp.stop();
    activityHasExited=true;
}
 }

支持等级:

 //source: http://stackoverflow.com/questions/18254870/play-a-sound-from-res-raw
 public class MediaManager {

private MediaPlayer mMediaPlayer;

public void stop() {
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}

public void playSoundClip(Context c, int rid) {
    stop();

    mMediaPlayer = MediaPlayer.create(c, rid);
    mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            stop();
        }
    });

    mMediaPlayer.start();
}
 }

编辑:通过将onDestroy更改为onStop(根据ChallengeAccepted或Simon的建议),如果用户在倒计时结束之前到达首页,活动将结束。 与未包含Intro活动相比,我仍然看到更多的内存使用情况。 由于此活动是一次性使用,因此我的目标是完全清理并保持我的应用程序尽可能小。

这不是内存泄漏。 如果您先打开一个活动A,然后再打开一个活动B,则第一个活动将继续在内存中运行,直到Android需要内存,或者Android认为该活动A可能不会再次打开。 此外,在您的情况下,活动A正在播放比平常活动要消耗更多的东西。

永远不会保证您的onDestroy方法甚至onStop方法都不会被调用,这就是Google建议我们使用onPause的原因,因为它会被确保被调用。

您可以通过点击此处阅读有关android生命周期的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM