我在后台线程(我使用AsyncTask)中从互联网下载了一些数据,并在下载时显示进度对话框。方向改变,Activity 重新启动,然后我的 AsyncTask 完成 - 我想关闭进程对话框并开始一个新的 Activity。但是调用dismissDialog有时会抛出异常(可能是因为Activity被销毁了,新的Activity还没有启动)。
AsyncTask
处理此类问题的最佳方法是什么(从后台线程更新 UI,即使用户改变方向也能正常工作)?谷歌的人是否提供了一些“官方解决方案”?
第 1 步:AsyncTask创建一个static嵌套类或完全独立的类,而不是内部(非静态嵌套)类。
static
步骤#2:通过数据成员AsyncTask持有Activity,通过构造函数和设置器设置。
Activity
步骤#3:创建时AsyncTask,将电流Activity提供给构造函数。
第 4 步:在中,将 , 与原始的、现在离开的活动分离后onRetainNonConfigurationInstance()返回。AsyncTask
onRetainNonConfigurationInstance()
第 5 步:在onCreate()中,如果getLastNonConfigurationInstance()不是null,则将其转换为您的AsyncTask类并调用您的设置器以将您的新活动与任务相关联。
onCreate()
getLastNonConfigurationInstance()
null
第 6 步:不要引用来自doInBackground().
doInBackground()
如果你按照上面的食谱,一切都会奏效。onProgressUpdate()并在后续onPostExecute()的开始和结束之间暂停。onRetainNonConfigurationInstance()``onCreate()
onProgressUpdate()
onPostExecute()
onRetainNonConfigurationInstance()``onCreate()
这是一个演示该技术的示例项目。
另一种方法是放弃AsyncTask并将您的工作移动到IntentService. 如果要完成的工作可能很长并且无论用户在活动方面做了什么(例如,下载一个大文件),这都特别有用。您可以使用有序广播Intent让活动响应正在完成的工作(如果它仍在前台)或引发 aNotification让用户知道工作是否已完成。
IntentService
Intent
Notification