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