调用getContext()的最佳位置是什么?

时间:2018-08-09 13:11:21

标签: android

我正在阅读片段文档,发现了这一点:

  

警告:如果您在Fragment中需要一个Context对象,则可以调用getContext()。但是,只有在将片段附加到活动时,才应小心调用getContext()。当片段尚未附加或在其生命周期结束时分离时,getContext()返回null

所以我的问题是在片段中调用getContext()的最佳位置是什么。就像我可以在其他任何地方的onCreateView或onCreate()或onAttach()中调用它一样。

我之所以这样问,是因为最近我在片段中使用getContext导致空指针崩溃。因此,我认为我应该创建一个全局Context对象并在片段中访问它。但是后来我从官方文档中看到了这段文字,所以我有点困惑什么是初始化此Context对象的最佳位置。

4 个答案:

答案 0 :(得分:2)

这一切都取决于您Context的需求。有时,调用getApplicationContext()很好,在其他情况下,可能需要使用onAttach()中给出的内容,或者如果您使用的是getActivity()代码,则调用Fragment。有些还提供自己的Application子类,公开了像getAppContext()这样的静态方法。

无论如何,避免保存上下文,因为它可能导致内存泄漏。仅在需要时动态获取它。

答案 1 :(得分:1)

鉴于给出了许多错误的答案,我将提供处理片段内部上下文的最佳方法。

最好的解决方案是在需要时检查上下文是否具有值。 您可以通过以下两种方式包装访问该片段的代码来做到这一点:

if (getContext() != null) { /* code here */ }

或者,如文档中所述,有此方法:

isAdded()

其中:“如果该片段当前已添加到其活动中,则返回true。” -reference

再次:请避免将上下文保存在本地片段的变量中。

答案 2 :(得分:-1)

您可以在片段中执行类似的操作。

def prime_iter(sz):
    '''
    Iterate through all the prime number in range [2,sz]
    '''
    bucket = [0]*sz
    for i in range(2,sz):
        if bucket[i]:
            continue
        for j in range(i+i,sz,i):
            bucket[j] = i
        yield i

# get all the primes from 2 to 100.
primes = list(prime_iter(100))

注意:我真的不明白为什么它不那么喜欢这个答案。 首先,根据android的版本(未提及),当然不赞成使用OnAttach,必须对其进行检查。 下一个: 我认为,如果您需要在某个地方使用cobntext,则可以在Fragment中创建一个私有或受保护的变量,因此在对其进行垃圾回收时会破坏上下文。 受保护的MainActivity活动;

请确保您持有此变量的金额很高,并且其引用不会传递给其他类。

这应该可以完成工作。

答案 3 :(得分:-3)

您可以这样实现逻辑:

private Context mContext;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
}
@Override
public void onDetach() {
    mContext = null;
    super.onDetach();
}

当您需要使用上下文时,

if(mContext != null) {
   //Add your logic here
}