2013-02-27 23 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