onAttach之后的片段和null getActivity

时间:2014-03-12 15:19:57

标签: android android-fragments android-support-library

我试图理解在什么情况下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();
}

2 个答案:

答案 0 :(得分:1)

如果您的应用程序进入后台或暂停,您是否停止/取消AsyncTask

请考虑以下情形:执行AsyncTask,当提示进度条时,用户在等待任务完成时决定执行其他操作。她按下主页按钮。唉,这可能会破坏片段和活动。正在运行的AsyncTask对此一无所知,完成后,getActivity()方法调用(或指向不存在的Activity的局部变量)也可能返回null,导致您的应用崩溃。

答案 1 :(得分:-2)

Fragment生命周期如下

Fragment life cycle

根据Fragment生命周期onCreate()onCreateView()Activity创建之前调用。所以当我们在这些方法中调用getActivity()时返回null。 所以不要在onCreateView()中启动异步任务,而是在onStart()onResume()中启动它,以便getActivity()返回确切的Activity引用。

有关详细信息click here