Android:onBackPressed()销毁所有内存?

时间:2013-02-26 09:51:44

标签: android memory android-activity back

我希望,当我按下我的某个活动的后退按钮时,返回上一个活动但在此之前我需要先删除内存中的所有位图和其他资源,否则我会收到一个内存错误。

我试过了:

public void onBackPressed() {
   bitmap.recycle();
   System.gc();
   Runtime.getRuntime().gc();
   Intent intent = new Intent(this,GameActivity.class);
   this.startActivity(intent);
}

但是仍有错误的错误。

4 个答案:

答案 0 :(得分:0)

即使您调用gc(),仍然会引用活动中无法收集的对象。如果内存问题与您的活动中声明的某些对象有关,请尝试将其引用更改为null,而不是调用gc()。如果你保留一些大缓存尝试使用WeakReference。当然,性能会降低,但你可能不会崩溃

您获得的行为看起来更像是设计中的缺陷。该应用程序使用太多内存,即使它可以在您当前正在测试的设备上运行,也可能在其他设备上出现问题。 System.gc()通常只能由操作系统调用,因为当你这样做时没有任何保证。

答案 1 :(得分:0)

请勿覆盖onBackPressed()

覆盖onStop()

@Override    
protected void onStop() {
    super.onStop();
    bitmap.recycle(); //PUT THE ACTUAL BITMAP THAT YOU WANT TO RECYCLE HERE !!!!!!!
    System.gc();
    Runtime.getRuntime().gc();
    Intent intent = new Intent(this,GameActivity.class);
    startActivity(intent);
}

答案 2 :(得分:0)

按下后退按钮调用此功能: -

private void unbindDrawables(View view) {
     Log.d(TAG,"in unbindDrawables");
        if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        ((ViewGroup) view).removeAllViews();
        view.setBackgroundResource(0);
        Log.d(TAG,"removed views");
        //finish();   

        }
 }

答案 3 :(得分:0)

我在之前的活动

上写过
@Override
public void onStop() {
    super.onStop();
 unbidDrawables and recycle bitmaps
}

@Override
public void onRestart(){
    onCreate(new Bundle());
}

这就像一个临时工作,但它有效!