所以,我完成了一个项目,现在我面临的主要问题是应用程序中的内存泄漏(“泄漏”意味着您保留对活动的引用,从而阻止 GC 收集它)
我发现的一些发生内存泄漏的情况是:
上下文泄漏
它的发生是因为对活动上下文的长期引用。
我在这里找到了一个很好的例子,
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);
}
这里的问题是private static Drawable sBackground;
静态 Drawable 是使用 Activity 作为上下文创建的,所以在这种情况下,有一个对引用 Activity 的 Drawable 的静态引用,这就是为什么存在泄漏的原因。只要该引用存在,Activity 就会保存在内存中,并泄漏其所有视图。
屏幕方向更改
引起注意的第二种情况是屏幕方向发生变化时。默认情况下,当屏幕方向发生变化时,系统将销毁当前活动并创建一个新活动,同时保留其状态。这样做时,Android 将从资源中重新加载应用程序的 UI。现在想象一下,您编写了一个带有大位图的应用程序,您不想在每次旋转时都加载该位图。
这将导致大量内存泄漏,因为可能需要加载大的位图。
上下文活动
第三种情况,我发现是对活动上下文的引用。它还会导致内存泄漏。
我想知道是否有任何简单的方法可以避免发生这种内存泄漏。或者是否有工具可以检查并从应用程序中删除这些内存泄漏。