我在fragment
里叫了一个AsyncTask
。我从那AsyncTask
的doInBackground
内打电话给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。