我找到了这篇文章“避免内存泄漏” http://android-developers.blogspot.it/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);
}
这不是一个好主意,因为:
当屏幕方向改变时,系统默认情况下,
销毁当前活动并创建新活动,同时保留其
状态。这样做时,Android 将从以下位置重新加载应用程序的 UI:
资源。
所以上面的代码:
...泄漏在第一个屏幕方向更改时创建的第一个活动。当 Drawable 附加到视图时,该视图是
设置为可绘制对象的回调。在上面的代码片段中,这
意味着drawable有一个对TextView的引用,它本身有一个
对活动(上下文)的引用,而该活动又具有引用
几乎任何东西(取决于你的代码。)
但是,当屏幕方向改变时,该方法setBackgroundDrawable(可绘制背景) http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.3_r1/android/view/View.java#View.setBackgroundDrawable%28android.graphics.drawable.Drawable%29被调用,进而调用:
background.setCallback(this);
方法Drawable.setCallback()
定义如下:
public final void setCallback(Callback cb) {
mCallback = new WeakReference<Callback>(cb);
}
因此,现在后台应该释放对先前 TextView 的旧引用,并应创建对新 TextView 的新引用。
因此,似乎更改屏幕方向只会在新创建活动之前泄漏引用。
我哪里出错了?