小编典典

后台任务、进度对话框、方向更改 - 是否有任何 100% 可行的解决方案?

all

我在后台线程(我使用AsyncTask)中从互联网下载了一些数据,并在下载时显示进度对话框。方向改变,Activity 重新启动,然后我的
AsyncTask 完成 - 我想关闭进程对话框并开始一个新的
Activity。但是调用dismissDialog有时会抛出异常(可能是因为Activity被销毁了,新的Activity还没有启动)。

处理此类问题的最佳方法是什么(从后台线程更新 UI,即使用户改变方向也能正常工作)?谷歌的人是否提供了一些“官方解决方案”?


阅读 90

收藏
2022-06-01

共1个答案

小编典典

第 1 步:AsyncTask创建一个static嵌套类或完全独立的类,而不是内部(非静态嵌套)类。

步骤#2:通过数据成员AsyncTask持有Activity,通过构造函数和设置器设置。

步骤#3:创建时AsyncTask,将电流Activity提供给构造函数。

第 4 步:在中,将 , 与原始的、现在离开的活动分离后onRetainNonConfigurationInstance()返回。AsyncTask

第 5
步:在onCreate()中,如果getLastNonConfigurationInstance()不是null,则将其转换为您的AsyncTask类并调用您的设置器以将您的新活动与任务相关联。

第 6 步:不要引用来自doInBackground().

如果你按照上面的食谱,一切都会奏效。onProgressUpdate()并在后续onPostExecute()的开始和结束之间暂停。onRetainNonConfigurationInstance()``onCreate()

这是一个演示该技术的示例项目。

另一种方法是放弃AsyncTask并将您的工作移动到IntentService.
如果要完成的工作可能很长并且无论用户在活动方面做了什么(例如,下载一个大文件),这都特别有用。您可以使用有序广播Intent让活动响应正在完成的工作(如果它仍在前台)或引发
aNotification让用户知道工作是否已完成。

2022-06-01