Android 我应该显式地遵从静态声明的上下文变量吗?

Android 我应该显式地遵从静态声明的上下文变量吗?,android,memory,Android,Memory,我正试图针对内存泄漏优化我的应用程序。我读过很多博客文章和问题,我看到一些人说遵从静态声明的变量,这样GC就可以收集它们,而另一些人说这是不必要的 public class MyActivity extends Activity { private static Context context; private static ArrayList<String> arrayList = new Arraylist<>(); protected void onCr

我正试图针对内存泄漏优化我的应用程序。我读过很多博客文章和问题,我看到一些人说遵从静态声明的变量,这样GC就可以收集它们,而另一些人说这是不必要的

public class MyActivity extends Activity {

private static Context context;
private static ArrayList<String> arrayList = new Arraylist<>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        arrayList.add("Random strings");
..//Other code
    }

    @Override
    protected void onDestroy() {
        context = null;
        arrayList.clear();
        super.onDestroy();
    }
公共类MyActivity扩展活动{
私有静态语境;
私有静态ArrayList ArrayList=新ArrayList();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
上下文=这个;
添加(“随机字符串”);
..//其他代码
}
@凌驾
受保护的空onDestroy(){
上下文=空;
arrayList.clear();
super.ondestory();
}
代码背后的原因是静态变量独立于活动生命周期,因此即使在onDestroy之后也会隐式保留整个活动上下文的引用,除非它的引用为null。但是我在我的应用程序中测试了这两个变量,它们之间没有任何差异。是否真的需要上面的内容?

我正试图针对内存泄漏优化我的应用程序

也许您不应该首先引入内存泄漏。摆脱<代码>私有静态上下文上下文< /代码>,并强烈考虑取消<代码>私有静态数组列表ARARELIST/COM> 在标准Java中,非常量

静态
字段被认为是一种严重的代码气味。它们在Android中使用得更为普遍,但仅在有明确理由这样做的情况下使用,然后仅作为缓存,然后才有更多的smarts管理该缓存

但我已经在我的应用程序中测试了这两种变体,它们之间没有任何差异


如果添加到项目中,您将看到不同。如果不将该
静态
字段设置为
null
,则在流程终止或创建此活动的另一个实例之前,您正在泄漏此活动实例(因为这将替换旧字段值).

为什么你要使用
context=this;
如果你能在你的活动课中使用
this
;谢谢你,马克。我在那里看到了你在@Samsung上关于内存管理的演讲-非常好的信息。我问这个问题的原因是因为这个问题的顶部答案使用了静态上下文:但谢谢你确认我的回答thoughts@Kyle:那是一个n
应用程序
,而不是
活动
。流程中有一个单独的
应用程序
实例,它是在流程分叉时提前创建的,在您的应用程序代码的其他大部分运行之前创建的。该
应用程序
实例在流程的整个生命周期中都存在,您对此无能为力实际上,它是“预先泄露的”,所以有一个“<代码>静态字段指向它不能进一步泄漏。”-——在Android中,大多数事情不是这样的,特别是活动,因为它们来来往往。我个人认为答案是代码气味。