片段获取活动始终从异步任务返回 null



我在fragment里叫了一个AsyncTask。我从那AsyncTaskdoInBackground内打电话给getActivity(),但getActivity正在返回null

如果我从外部调用getActivity AsyncTask它工作正常,但我需要在asyncTask本身内部activity实例。

任何帮助将不胜感激。 !!

将活动传递给 AsyncTask 方法

new Demo().execute(getActivity());
public class Demo extends AsyncTask<Activity,Void,Void>{
    Activity activity=null;
    @Override
    protected Void doInBackground(Activity... params) {
        activity=params[0]; //get the activity instance 
        //Do your task
        return null;
    }
}

两种解决方案都可以正常工作,我正在发布。尝试其中任何一个。

解决方案 1 :

尝试在onActivityCreated而不是onCreateView中调用您的AsynTask,因为有时会发生活动实例返回null onCreateView

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
 // call AsynTask here, getActivity() not return null here
}

解决方案 2 :

fragment附加到Activity上时获取activity实例,然后在AsynTask中使用Activity context(无需调用getActivity(((。

private Activity mContext;
// called for API equal or above 23
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.mContext = (Activity) context;
}
/*
* Deprecated on API 23
*/
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mContext = activity;
}
// Use mContext in asyntask 

在您的片段中添加

Activity mActivity; //declare as global variable
@Override
public void onAttach(Context context) {
super.onAttach(context);
  if (context instanceof Activity){
    mActivity=(Activity) context;
}
}

然后在您的AsyncTask中使用mActivity而不是getActivity()

异步任务可能正在进行,但片段关闭,因此您已将getActivty((传递给AsyncTask。

最新更新