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

Android getContext()方法在片段中返回null。将上下文保存在变量中是一个好主意吗?我想了解利弊,android,android-context,Android,Android Context,我所做的是 方法1: public View onCreateView(.....){ context = getContext(); } 我在任何需要的地方使用这个上下文对象。这是正确的方法还是我应该使用getContext!=null并使用getContext返回的值。我也知道我可以从getActivity获取上下文,但是如果“getContext”返回null,它也将返回null 作为替代,我可以在每次需要上下文时都这样做 方法2: if(getActivity() != nu

我所做的是

方法1:

public View onCreateView(.....){
     context = getContext();
}
我在任何需要的地方使用这个上下文对象。这是正确的方法还是我应该使用getContext!=null并使用getContext返回的值。我也知道我可以从getActivity获取上下文,但是如果“getContext”返回null,它也将返回null

作为替代,我可以在每次需要上下文时都这样做

方法2:

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

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

在片段中重写函数

private Context mContext;

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

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

在片段中重写函数

private Context mContext;

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

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

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

//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();
}

好的,如果您需要获取上下文并保存它,我建议您在当前活动上创建一个静态变量,如果您只使用一个活动

//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();
}
如果片段未附加到活动/上下文,则getActivity和getContext都将返回null。如果它们返回null,我不建议使用任何以前存储的值,因为存储的上下文可能已被分离,并可能导致内存泄漏

@Override
public void onDetach() {
    this.activity = null;
    super.onDetach();
}
通常,在附加片段后,您会得到一个上下文。您可以将上下文存储在上下文回调中

@凌驾 公共上下文{ 超级语境; this.context=上下文; } 但是,确保在片段分离时将其设置为null,以避免内存泄漏

@Override
public void onDetach() {
    this.activity = null;
    super.onDetach();
}
将上下文存储在我能想到的变量中没有任何缺点,除非您需要注意片段状态的更改。onDetach调用会处理这个问题。

getActivity和getContext如果您的片段未附加到活动/上下文,则两者都将返回null。如果它们返回null,我不建议使用任何以前存储的值,因为存储的上下文可能已被分离,并可能导致内存泄漏

@Override
public void onDetach() {
    this.activity = null;
    super.onDetach();
}
通常,在附加片段后,您会得到一个上下文。您可以将上下文存储在上下文回调中

@凌驾 公共上下文{ 超级语境; this.context=上下文; } 但是,确保在片段分离时将其设置为null,以避免内存泄漏

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

将上下文存储在我能想到的变量中没有任何缺点,除非您需要注意片段状态的更改。OnDetch调用会解决这个问题。

getActivitySecond方法是更好的方法。将上下文存储为局部变量可能是有害的,因为片段有自己的生命周期,我们无法预测上下文在哪个阶段变为null getActivity或getContext.getActivitySecond是更好的方法。将上下文存储为局部变量可能是有害的,因为片段有自己的生命周期,我们无法预测上下文在哪个阶段变为null getActivity或getContext。将上下文存储在静态变量中会导致应用程序内存泄漏。避开它!将上下文存储在静态变量中会导致应用程序内存泄漏。避开它!