我一直在研究在創建視圖時防止上下文/活動內存泄漏的最佳實踐,並且我無法在它發生什麼或不被允許時找到明確的答案來到類中的靜態字段。Android:靜態字段和內存泄漏
比方說,我有這種形式的代碼:
public class MyOuterClass extends Activity{
private MyInnerClass;
MyInnerClass = (MyInnerClass) findViewById(<XML call here>);
MyInnerClass.myXInt = 3;
// onCreate(), onResume(), etc.
public static class MyInnerClass extends SurfaceView implements Runnable{
// Safe variables?
private static int myXInt, myYInt;
private static boolean myBoolean;
// Potentially safe?
private static Canvas myCanvas;
// Definitely bad.
private static Context myContext;
public MyInnerClass(Context context){
myContext = context; // This is bad.
}
}
}
我就什麼JVM實際上考慮了MyInnerClass ClassLoader的輕度的意識模糊。從技術上講,因爲它是一個SurfaceView對象,所以一旦應用程序一次實例化MyInnerClass(發生在View第一次膨脹時),靜態變量應該總是存在,然後一直存在,直到應用程序本身終止。如果是這種情況,那麼防止Bitmaps和Canvas對象保持打開狀態並填充堆?
我一遍又一遍地看到的唯一的聲明是你不能像構造函數中顯示的那樣泄露靜態上下文,但它永遠不會超越這個。那真的是你唯一不能做的事情嗎?
你的Canvas等不需要是靜態的。這樣它將永遠留在堆中 – zapl 2012-08-10 19:44:56
如果是這種情況,那麼什麼會阻止常量(即 - private static final int MY_CONSTANT)從持有任何擴展活動(及其上下文)的類打開? – SeaNick 2012-08-10 19:48:37