【发布时间】:2012-08-08 03:10:07
【问题描述】:
我一直在研究在创建视图时防止上下文/活动内存泄漏的最佳实践,但对于类中的静态字段,我似乎无法找到明确的答案。
假设我有一个这种形式的代码:
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 第一次膨胀时),静态变量似乎应该始终存在,然后保持在那里直到应用程序本身终止。如果是这样,是什么阻止了位图和画布对象也保持打开状态并填满堆?
我见过的唯一一个反复重复的声明是,你不能像我在构造函数中显示的那样泄漏静态上下文,但它永远不会超出这个范围。这真的是你唯一不能做的事吗?
【问题讨论】:
-
您的
Canvas等不必是static。这样它确实会永远留在堆中 -
如果是这种情况,那么是什么阻止了常量(即 - private static final int MY_CONSTANT)也保持任何扩展活动(及其上下文)打开的类?
标签: android memory memory-leaks android-activity android-context