【问题标题】:Should I explicitly deference a statically declared Context variable?我应该明确地尊重静态声明的 Context 变量吗?
【发布时间】:2016-02-06 12:59:04
【问题描述】:

我正在尝试针对内存泄漏优化我的应用。我已经阅读了很多博客文章和 SO 问题,并且我看到有些人说要尊重静态声明的变量,以便 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();
    }

代码背后的原因是静态变量独立于活动生命周期,因此即使在 onDestroy 之后也会隐式保存整个活动上下文的引用,除非它的引用为空。但我已经在我的应用程序中测试了这两种变体,彼此之间没有任何差异。以上真的有必要吗?

【问题讨论】:

  • 如果您可以在活动类中使用this,为什么要使用context = this;

标签: android memory


【解决方案1】:

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

那么也许您一开始就不应该引入内存泄漏。摆脱private static Context context,并强烈考虑摆脱private static ArrayList&lt;String&gt; arrayList

在标准 Java 中,非常量 static 字段被认为是严重的代码异味。它们在 Android 中使用得更普遍一些,但只有在有明确理由的情况下才使用,然后仅用作缓存,然后只有更智能的管理缓存。

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

如果您将LeakCanary 添加到您的项目中,您将看到不同之处。如果不将 static 字段设置为 null,您将泄漏此活动实例,直到您的流程终止,或者直到创建此活动的另一个实例(因为这将替换旧的字段值)。

【讨论】:

  • 谢谢马克。我在@Samsung 看到了你关于内存管理的演讲——那里也有很好的信息。我问的原因是因为这个问题的最佳答案使用了静态上下文:stackoverflow.com/questions/2002288/… 但是感谢您确认我的想法
  • @Kyle:那是Application,而不是Activity。在你的进程中有一个单例 Application 实例,在进程分叉时预先创建,在你的应用程序代码的大部分其他内容运行之前。 Application 实例在整个过程中都存在,您对此无能为力。实际上,它是“预先泄露的”,因此有一个指向它的static 字段不能进一步泄露它。 :-) Android 中的大多数其他东西都不是这种情况,尤其是活动,因为它们来来去去。就个人而言,我认为这个答案是代码味道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多