Fragment getActivity 总是从 Async Task 返回 null

Fragment getActivity is always returning null from Async Task

我在 fragment 中调用了一个 AsyncTask。我从那个 AsyncTaskdoInBackground 中调用 getActivity(),但是 getActivity 正在返回 null

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

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

在您的片段中添加

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。

将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;
    }
}

我发布的两种解决方案都有效。尝试其中任何一个。

解决方案一:

尝试在 onActivityCreated 中调用您的 AsynTask 而不是在 onCreateView 中调用,因为有时 Activity 实例 return 是 nullonCreateView.

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

方案二:

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