我正在尝试实施Android库。在教程中,我发现了下面的文字,我无法理解为什么当我有一个非静态内部类时,我不能引用 App 或活动上下文?
有人可以向我解释一下吗?
另一个常见的提示是避免在非静态内部类中引用上下文 当你无法控制他们的生命周期时的活动。使用静态内部类和弱 改为引用该活动。
答案 0 :(得分:1)
我认为这是一种防止内存泄漏的方法。
示例:
考虑在活动中运行的AsyncTask需要花费大量时间才能完成:
public class VeryLongRunningTask extends AsyncTask<?,?,?> {
protected Object doInBackground(Object[] params) {
while(runForVeryLongTime()){
doSomethingWithContext(getContext())
}
return null;
}
}
现在开始您的活动onCreate,您可以运行任务
public void onCreate(Bundle bundle){
new VeryLongRunningTask().execute()
}
正如您所看到的,VeryLongRunningTask
将在很长一段时间内保留您的活动参考(可能会长得Activity
可见)。这意味着该活动不会在很长一段时间内被垃圾收集。
答案 1 :(得分:0)
系统只维护一个静态类的实例,因此如果内部类是静态的,则每个活动只有一个实例。如果内部类不是静态的,则可以在访问活动的内部类上有多个实例,并且每个实例都可以独立地修改活动状态。
如果您实际创建内部类的多个实例,则会导致许多挑战。可以这样想,你有一个内部类可以更新活动中的计数器变量,然后根据计数器的值循环一个列表。如果内部类是静态的,那么它只有一个实例。但是,如果它不是静态的,那么可能会有三个实例这样做。请记住,所有三个都访问相同的活动和相同的计数器,所以如果它们在不同的时间运行(很可能),它们会在不同的时间更新变量然后循环。因此,当第一个实例更新变量并开始循环检查值时,第二个实例然后更改变量,现在影响第一个循环。然后它开始循环,然后第三个实例再次更新计数器,影响其他实例。所以现在内部类中先前运行的实例都不会产生正确的结果。
这是一个非常简单的例子,事情会变得更糟,更糟糕。