2013-02-26 109 views
0

我想,當我按我的活動之一後退按鈕,返回到以前的活動,但在此之前,我需要刪除內存中的所有位圖和其他資源的第一,否則我得到一個內存不足錯誤。Android:onBackPressed()銷燬所有內存?

我想:

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

但仍然有該內存不足的錯誤。

+0

Offtopic:你爲什麼對backpressed啓動一個新的活動,而不是僅僅讓這個接近。你之前的那個會自動啓動。 – RvdK 2013-02-26 09:53:53

+0

不要創建意圖和新的活動,而是調用'super.onBackPressed'來代替它。猜你需要學習onResume'的'權力和'onPause' – Prateek 2013-02-26 09:55:40

+0

當我按下後退按鈕它關係到我以前的活動,但活動是怎麼樣子到底,而不是在開始時 – morg 2013-02-26 09:56:22

回答

0

即使調用GC()仍然有不能被收集在你的活動對象的引用。如果內存問題與您的活動中聲明的某些對象相關,請嘗試將其引用更改爲null並調用gc()。如果你使用WeakReference來獲得一些大的緩存。當然,性能會下降,但你可能不會崩潰

行爲你得到看起來更像是在設計上的缺陷。該應用程序使用太多的內存,即使它可以在您正在測試的設備上工作,但在其他設備上可能會出現問題。 System.gc()通常只能由操作系統調用,因爲在執行操作時無法保證。

+0

這是我所擔心的。但是我應該怎麼做,在每一項新活動開始時清理一切? – morg 2013-02-26 10:02:48

+0

你不能清理一切。其中一個原因是因爲這不是Java應該如何工作的原因。它沒有提供C/C++關於內存分配釋放的支持。不能釋放所有內容的第二個原因是因爲系統正在引用一些對象。當onDestroy()被調用時,那些應該被解除分配,但是這是你無法控制的。試着理解你爲什麼耗盡內存。 Eclipse中的工具可以提供有關分配內存的良好信息。 – azertiti 2013-02-26 10:06:21

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); 
} 
+0

這是一個非常糟糕的主意。如果系統調用onStop是因爲它需要殺死應用程序會怎麼樣? – 2013-02-26 10:00:03

+0

+我不想在上一次活動停止時啓動上一次活動,但當按下返回按鈕時,按下返回按鈕 – morg 2013-02-26 10:01:05

+0

@morg被調用時,如果要使兩個活動都運行,我同意這一點是不是要走的路 – 2013-02-26 10:46:33

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(); 

     } 
} 
+0

請注意'((ViewGroup)視圖).removeAllViews()' - 它可能會拋出'UnsupportedOperationException' ,如果你有適配器視圖。 – 2013-02-26 10:02:01

+0

當我在之前的活動(在onStop())和第二個活動(onBackPressed())中這樣做時,我會回到活動的開始處(我想要的),但是如果我觸摸屏幕(它會啓動動畫),我仍然有內存錯誤 – morg 2013-02-26 10:15:19

+0

看來,即使當我解綁bitmpas仍然在內存中!當我解除所有活動時,我有內存錯誤 – morg 2013-02-26 11:27:29

0

我寫的上一活動

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

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

這就像一個臨時工,但它的工作原理!