在我的应用程序中,我有几个AsyncTasks在做http请求。 如果任务失败,我会向用户显示DialogFragment。
ErrorDialogFragment newFragment = ErrorDialogFragment.newInstance(R.string.dialog_message_error);
newFragment.show(getFragmentManager(), ConstantHandler.DIALOG_ERROR);
问题是用户有时在AsyncTask完成之前退出Activity或Application,导致getFragmentManager出现空指针异常。
我的问题是,是否有办法避免这种情况,除非跟踪每个片段和活动是否仍在运行?
答案 0 :(得分:3)
我之前遇到过同样的问题。我在博客上看到的一个相当不错的答案(我已经忘记了)如下:
为AsyncTasks提供对当前上下文的引用。当您的应用最小化/轮换时,请使用onRetainNonConfigurationInstance()
和getLastNonConfigurationInstance()
保存AsyncTasks。然后,当您的应用重新启动时,在onCreate()
中,您可以检查是否存在从getLastNonConfigurationInstance()
传回的AsyncTask。如果有,请将其上下文设置为您的活动的新上下文。现在,您的AsyncTask将能够访问新的Context并完成其任务。
要彻底,您可能还希望在使用null
保存之前,在AsyncTasks中将上下文设置为onRetainNonConfigurationInstance()
。然后在AsyncTask中,在尝试使用它之前检查Context是否为null。如果AsyncTask在后台尝试使用上下文,这将停止应用程序崩溃。