片段中的 getContext() 方法 returns 为 null。将上下文保存在变量中是个好主意吗?我想了解利弊

getContext() method returns null in fragment. Is it a good idea to keep the context in a variable? I want to understand the pros and cons

我做的是

方法一:

public View onCreateView(.....){
     context = getContext();
}

我在任何需要的地方使用这个上下文对象。这是正确的方法还是我应该使用 getContext != null 并使用由 getContext() 编辑的值 return。我也明白我可以从 getActivity() 获取上下文,但如果 'getContext()' 是 returning null.

它也会 return null

作为替代方案,我可以在每次需要上下文时执行此操作。

方法二:

if(getActivity() != null){
      //use getActivity() here
}

我想了解哪种方法更好,为什么?

在您的片段中覆盖函数

private Context mContext;

@override
void onAttach(Context context) {
    mContext = context;
}

这就是您在片段中获取上下文的方式,因为从不建议将上下文传递给来自活动的片段和适配器。

好吧,如果您需要获取上下文并保留它,我建议您在当前 activity 上创建一个静态变量(如果您只使用一个 activity)

//if use only one Activity
private static Context context;
public static Context getRunningContext() {
    return context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    this.context=getApplicationContext();
}

或改用 getActivity()。

    Context context;
   public View onCreateView(.....){
   context = getActivity();
}
如果您的片段未附加到 activity/context,

getActivity()getContext() 都将 return 为空。如果它们是 returning null,我不建议使用任何以前存储的值,因为存储的上下文可能已分离并可能导致内存泄漏。

通常,您会在附加片段后获得上下文。您可以将上下文存储在 onAttach(Context) 回调中。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;
}

但是,请务必在片段分离时将其设置为 null 以避免内存泄漏。

@Override
public void onDetach() {
    this.activity = null;
    super.onDetach();
}

我能想到将上下文存储在变量中没有任何缺点,除非您需要注意片段状态的变化。 onDetach() 调用会处理这个问题。