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

本教程将介绍后台任务、进度对话框、方向更改 – 是否有任何 100% 可行的解决方案?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

问题描述

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

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

推荐答案

第 1 步:将您的 AsyncTask 设为 static 嵌套类,或完全独立的类,只需不是内部(非静态嵌套)类.

第 2 步:让 AsyncTask 通过数据成员持有 Activity,通过构造函数和 setter 设置.

第 3 步:创建 AsyncTask 时,将当前 Activity 提供给构造函数.

第 4 步:在 onRetainNonConfigurationInstance() 中,将 AsyncTask 与原始的、即将消失的活动分离后返回它.

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

第 6 步:不要从 doInBackground() 中引用活动数据成员.

如果你按照上面的方法,一切都会奏效.onProgressUpdate()onPostExecute()onRetainNonConfigurationInstance() 开始和后续 onCreate().

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

另一种方法是放弃 AsyncTask 并将您的工作转移到 IntentService 中.如果要完成的工作可能很长并且无论用户在活动方面做什么(例如,下载大文件)都应该继续进行,这尤其有用.您可以使用有序广播 Intent 让活动响应正在完成的工作(如果它仍在前台)或引发 Notification 让用户知道如果工作已经完成.这是一篇博文模式.

好了关于后台任务、进度对话框、方向更改 - 是否有任何 100% 可行的解决方案?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。

0
没有账号?注册  忘记密码?