我试图理解在什么情况下getActivity()会在片段AFTER onAttach中返回null。我通常在我的片段中的onCreate或onCreateView中启动异步任务,但是我收到错误报告,表明当异步任务完成时,getActivity()有时会为null。错误报告通过crashlytics进入,但无法重现它们。
异步任务是“阻塞” - 我显示一个模态不可忽略的进度条。通过调用setRequestedOrientation来防止旋转。
我正在使用v4支持Fragment和FragmentActivity。片段设置为保留状态。
我错过了什么?是否有其他配置更改可能导致片段被分离?
我尝试暂时启用旋转和dev选项以在离开后销毁活动但仍然无法重现此...
以下是我的一个片段中的一些相关代码,在这种情况下,它有时会在activity.dismissSpinner
处与NPE分开:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
checkIfLoggedIn();
}
public void checkIfLoggedIn() {
LoginActivity activity = (LoginActivity)getActivity();
activity.showSpinner("Connecting, please wait...");
AsyncTask<String, Void, JsonResponse> asyncTask = new AsyncTask<String, Void, JsonResponse>() {
protected JsonResponse doInBackground(String... notused) {
return cmsServer().getCurrentUser(getActivity());
}
protected void onPostExecute(JsonResponse result) {
LoginActivity activity = (LoginActivity)getActivity();
activity.dismissSpinner();
//...more stuff here
}
};
asyncTask.execute();
}
答案 0 :(得分:1)
如果您的应用程序进入后台或暂停,您是否停止/取消AsyncTask
?
请考虑以下情形:执行AsyncTask,当提示进度条时,用户在等待任务完成时决定执行其他操作。她按下主页按钮。唉,这可能会破坏片段和活动。正在运行的AsyncTask
对此一无所知,完成后,getActivity()
方法调用(或指向不存在的Activity的局部变量)也可能返回null
,导致您的应用崩溃。
答案 1 :(得分:-2)
Fragment
生命周期如下
根据Fragment
生命周期onCreate()
和onCreateView()
在Activity
创建之前调用。所以当我们在这些方法中调用getActivity()
时返回null。
所以不要在onCreateView()
中启动异步任务,而是在onStart()
或onResume()
中启动它,以便getActivity()
返回确切的Activity
引用。
有关详细信息click here