在我的应用程序中,我有几个执行 http 请求的 AsyncTasks。 如果任务失败,我会向用户显示 DialogFragment。
ErrorDialogFragment newFragment = ErrorDialogFragment.newInstance(R.string.dialog_message_error);
newFragment.show(getFragmentManager(), ConstantHandler.DIALOG_ERROR);
问题在于,用户有时会在AsyncTask完成之前退出Activity或Application,导致getFragmentManager出现空指针异常。
我的问题是,除了跟踪每个 fragment 和 Activity 是否仍在运行之外,是否有办法避免这种情况?
最佳答案
我以前也遇到过同样的问题。我在某个博客上看到的一个相当好的答案(我忘记了)如下:
为您的 AsyncTasks 提供对当前上下文的引用。当您的应用最小化/旋转时,使用 onRetainNonConfigurationInstance()
和 getLastNonConfigurationInstance()
保存 AsyncTasks。然后,当您的应用重新启动时,在 onCreate()
中,您可以检查是否有从 getLastNonConfigurationInstance()
传回的 AsyncTask。如果有,请将其上下文设置为您的 Activity 的新上下文。现在您的 AsyncTask 将能够访问新的 Context 并完成其任务。
为了彻底起见,您可能还希望在使用 onRetainNonConfigurationInstance()
保存 AsyncTasks 中的上下文时将其设置为 null
。然后在 AsyncTask 中,在尝试使用 Context 执行某些操作之前检查 Context 是否为 null。如果 AsyncTask 尝试在后台使用上下文,这将阻止应用程序崩溃。
关于android - DialogFragment 导致空指针崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11608080/