关于android内存泄漏

时间:2015-12-02 15:20:09

标签: android memory-leaks

在这个官方博客网站中,我阅读了下面的内存泄漏示例。

http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);
  setContentView(label);
}

引用原帖"这段代码非常快,也非常错误;它泄漏了第一次屏幕方向更改时创建的第一个活动。将Drawable附加到视图时,视图将设置为drawable上的回调。在上面的代码片段中,这意味着drawable具有对TextView的引用,TextView本身具有对活动(Context)的引用,而Activity又引用了几乎任何东西(取决于您的代码。)"

我不明白这一部分。重新创建活动时,将执行onCreate()方法,静态Drawable对象sBackground将附加到第二个活动中的新TextView。这意味着对象sBackground将在第一个活动中引用新的textview而不是旧的textview,从而使第一个活动不被引用。

有人可以告诉我我的推理在哪里出错吗?提前谢谢~~

哎呀,似乎这个帖子是重复的,有人在这里问完全相同的事情 Understanding memory leaks in Android application 抱歉我粗心。

1 个答案:

答案 0 :(得分:0)

据我所知,在检查View类的源代码后,当一个Drawable附加到视图时,该视图被设置为drawable上的回调。此外,该视图还保留了对此Drawable的引用。请参阅此链接http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/View.java#16292。 并且因为静态变量具有较长的生命周期,所以每次重新创建活动时都会将Drawable设置为其视图,活动及其Context也保持对静态Drawable的引用。然后只要变量就记住记忆。