0

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

我试过了:

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

但是仍然有内存不足的错误。

4

4 回答 4

0

我在之前的活动中写过

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

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

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

于 2013-02-26T15:41:49.357 回答
0

即使您调用 gc(),仍然存在对您的活动中无法收集的对象的引用。如果内存问题与您的活动中声明的某些对象有关,请尝试将它们的引用更改为 null,然后调用 gc()。如果您维护一些大型缓存,请尝试使用 Wea​​kReference。当然,性能会下降,但你可能不会崩溃

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

于 2013-02-26T09:58:17.777 回答
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);
}
于 2013-02-26T09:59:11.693 回答
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();   

        }
 }
于 2013-02-26T10:00:43.780 回答