2012-07-23 70 views
2

在我的应用程序中,我有几个执行http请求的AsyncTasks。 如果任务失败,我向用户显示一个DialogFragment。导致空指针崩溃的DialogFragment

ErrorDialogFragment newFragment = ErrorDialogFragment.newInstance(R.string.dialog_message_error); 
newFragment.show(getFragmentManager(), ConstantHandler.DIALOG_ERROR); 

的问题是,用户有时退出活动或之前的AsyncTask应用程序完成时,造成在getFragmentManager一个零指示字例外。

我的问题是,如果有一种方法可以避免这种情况,除非跟踪每个片段和活动是否仍在运行?

回答

3

我以前有过同样的问题。我在博客某处(我已经忘记)看到了一个相当好的答案,如下所示:

为您的AsyncTasks提供对当前上下文的引用。当您的应用程序最小化/旋转时,使用onRetainNonConfigurationInstance()getLastNonConfigurationInstance()保存您的AsyncTasks。然后,当您的应用重新启动时,在onCreate()中,您可以检查是否有从getLastNonConfigurationInstance()传回的AsyncTask。如果存在,则将其设置为您活动的新上下文的上下文。现在您的AsyncTask将能够访问新的上下文并完成其任务。

为了彻底,您可能还希望在您的AsyncTasks中将您的上下文设置为null,然后使用onRetainNonConfigurationInstance()保存它们。然后在你的AsyncTask中,在尝试使用它之前检查Context是否为空。如果AsyncTask在后台尝试使用上下文,这将停止应用程序崩溃。

+0

感谢您的回答。尽管如此,仍然看到更多的工作,然后只是跟踪每个活动。现在我在onCreate中设置activityAlive布尔值为true,在onDestroy中设置false,并在显示对话框之前执行活动检查。 – Slickelito 2012-07-23 08:38:20

+0

它确实看起来像一个痛苦。我正忙着写下我的下一个应用程序,并试图避免对话。轮换/最小化问题只是一个痛苦。 – 2012-07-23 09:16:25

+0

给予应有的抵免。以下是帖子:http://blog.doityourselfandroid.com/2010/11/14/handling-progress-dialogs-and-screen-orientation-changes/ – 2012-07-23 10:25:22