我一直在研究如何在创建视图时防止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一次(这发生在首次填充视图时),静态变量似乎应该始终存在,并保持到应用程序本身被终止。如果这是真的,那么是什么阻止了位图和画布对象也保持开启并填满堆内存?
我看到唯一反复重申的声明是你不能像我在构造函数中所示泄漏静态上下文,但它从未超出这个范畴。这真的是你不能做的唯一的事情吗?
Canvas
等不需要是static
的。这样它确实会永远留在堆中。 - zapl