2013-02-27 62 views
0

我從Romain Guy讀了關於避免Android中的內存泄漏。我明白我必須如何避免畫布中的內存泄漏?

使用getApplicationContext()來避免內存泄漏。無論如何,我的代碼如下:

MainMenuActivity.java

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
canvasMenu = new CanvasMainMenu(this); 
setContentView(canvasMenu); 
} 

CanvasMainMenu.java

public class CanvasMainMenu extends View { 
     private TextView textChallenge; 
     public CanvasMainMenu(Context context) { 
       super(context); 
         textChallenge = null; 
         textChallenge = new TextView(context); 
         textChallenge.setTypeface(fontJoan); 
         textChallenge.setTextColor(Color.WHITE); 
         textChallenge.setText("99"); 
         textChallenge.measure((int)Define.getScreenWidth(), (int)Define.getScreenHeight()); 
         textChallenge.layout(0, 0, 200, 200); 
         textChallenge.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20); 
         textChallenge.setDrawingCacheEnabled(true); 
         textChallenge.buildDrawingCache(); 
     } 
} 

我的問題是,如何避免,如果我的代碼看起來像這樣MEM泄漏。

我必須在MainMenu.java文件中創建static TextView嗎?

有人請解釋我,如果我明白錯誤。

回答

0

你爲什麼會認爲這段代碼泄漏內存?唯一奇怪的是在CanvasMainMenu中使用私人TextView對象(textChallenge)。你爲什麼要創造這個?它在你的班級似乎沒有任何用處。

爲了解決您的具體問題:通常,創建static視圖引用是內存泄漏的根源,而不是避免它們的一種方式。除非你絕對必須(非常罕見的情況),並且你知道你在做什麼,否則不要這樣做。

對於您的代碼,我也看不到如何使用應用程序上下文將有助於內存泄漏。這通常只在需要上下文引用時纔有用,該上下文引用將在活動被破壞並重新創建(例如設備重新定向之後)中生存下來。

+0

對不起,我在'onDraw()'中使用'textChallenge'來繪製這個文本。當我創建了很多'TextView'。我通過'(Debug.getNativeHeapAllocatedSize()/ 1048576L)'檢查了alloc大小,發現當我回到'MainMenu.java'時。每次分配大小都會增加一點點。這就是爲什麼我認爲這是mem泄漏問題。 – barssala 2013-02-27 08:47:01

+0

你說'查看'引用。那是什麼?它就像'View','SurfaceView','TextView','Bitmap'。我對嗎? – barssala 2013-02-27 09:21:11

+0

@barssala - 是的,從'View'派生的類型的任何變量都是視圖引用。靜態'View'引用是內存泄漏的常見原因,因爲它們保持對活動的引用,並且在靜態活動被破壞時不會消失。爲了在自定義視圖中繪製文本,您應該使用['Layout'](http://developer.android.com/reference/android/text/Layout.html)對象,而不是'TextView'。 – 2013-02-27 16:08:44