ビューの作成時に Context/Activity のメモリ リークを防止するためのベスト プラクティスを研究してきましたが、クラスの静的フィールドに関して何が許可され、何が許可されないかについて明確な答えを見つけることができないようです。
この形式のコードがあるとしましょう:
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 を 1 回インスタンス化すると (View が最初に膨張したときに発生します)、静的変数は常に存在し、アプリケーション自体が終了するまでそこに留まるように見えます。その場合、Bitmaps と Canvas オブジェクトも開いたままになり、ヒープがいっぱいになるのを妨げているのは何ですか?
私が何度も繰り返し見た唯一のステートメントは、コンストラクターで示したように静的コンテキストをリークできないということですが、それを超えることはありません。本当にそれしかできないんですか?