从getContext()或构造函数获取上下文作为字段

时间:2012-04-24 16:56:57

标签: android android-custom-view android-context

让我们使用自定义或扩展视图作为示例。

Context参数从构造函数中保存为字段比在任何地方调用getContext()更有效(假设有,或者说,需要10个或更多位置) ?

3 个答案:

答案 0 :(得分:4)

不要在每个地方使用getContext(),最好将当前上下文作为参数传递给你想要使用的构造函数。

答案 1 :(得分:1)

看起来,从源代码中,View的构造函数存储了context参数,这就是getContext()返回的内容:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/View.java#View.getContext%28%29

所以,我的直觉是自己存储参数会是多余的,因为超类已经为你做了。

答案 2 :(得分:1)

View#getContext()

class View {
    protected Context mContext;
    public final Context getContext() {
        return mContext;
    }
}

和本地缓存的实现:

class X {
    private final Context mLocalContext;
    public X(Context ctx) {
        mLocalContext = ctx;
    }
}

现在使用mLocalContext代替getContext()时存在很小的差异。 JVM可以获得上下文对象所需的引用,而无需执行该方法(这需要一点额外的时间)。由于View#mContext是可变的(可以改变),因此无法优化该调用。在本地示例中,它可以假设mLocalContext无法更好地更改和优化代码。 [注意:我不是100%确定优化是什么/可以做什么]

如果您经常使用上下文,那么差异可能是可测量的,但在这种情况下它并不重要。如果您经常需要它们,那么在本地缓存对象仍然是个好主意。特别是当他们的(重新)构造需要时间时(例如,当getContext()创建new Context()左右时)。