从非静态内部类引用App上下文

时间:2014-10-31 15:43:32

标签: java android android-context

我正在尝试实施Android库。在教程中,我发现了下面的文字,我无法理解为什么当我有一个非静态内部类时,我不能引用 App 或活动上下文?

有人可以向我解释一下吗?

  

另一个常见的提示是避免在非静态内部类中引用上下文       当你无法控制他们的生命周期时的活动。使用静态内部类和弱       改为引用该活动。

2 个答案:

答案 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)

系统只维护一个静态类的实例,因此如果内部类是静态的,则每个活动只有一个实例。如果内部类不是静态的,则可以在访问活动的内部类上有多个实例,并且每个实例都可以独立地修改活动状态。

如果您实际创建内部类的多个实例,则会导致许多挑战。可以这样想,你有一个内部类可以更新活动中的计数器变量,然后根据计数器的值循环一个列表。如果内部类是静态的,那么它只有一个实例。但是,如果它不是静态的,那么可能会有三个实例这样做。请记住,所有三个都访问相同的活动和相同的计数器,所以如果它们在不同的时间运行(很可能),它们会在不同的时间更新变量然后循环。因此,当第一个实例更新变量并开始循环检查值时,第二个实例然后更改变量,现在影响第一个循环。然后它开始循环,然后第三个实例再次更新计数器,影响其他实例。所以现在内部类中先前运行的实例都不会产生正确的结果。

这是一个非常简单的例子,事情会变得更糟,更糟糕。