- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在后台线程(我使用 AsyncTask
)中从 Internet 下载一些数据,并在下载时显示进度对话框。方向改变,Activity 重新启动,然后我的 AsyncTask 完成 - 我想关闭进程对话框并开始一个新的 Activity。但是调用dismissDialog有时会抛出异常(可能是因为Activity被销毁了,新的Activity还没有启动)。
处理此类问题的最佳方法是什么(从后台线程更新 UI,即使用户改变方向也能正常工作)? Google 是否有人提供了一些“官方解决方案”?
最佳答案
第 1 步:将您的 AsyncTask
设为 static
嵌套类,或完全独立的类,而不是内部(非静态嵌套)类。
第 2 步:让 AsyncTask
通过数据成员持有 Activity
,通过构造函数和 setter 设置。
第 3 步:创建 AsyncTask
时,将当前 Activity
提供给构造函数。
第 4 步:在 onRetainNonConfigurationInstance()
中,将 AsyncTask
与原始的、即将消失的 Activity 分离后返回它。
第 5 步:在 onCreate()
中,如果 getLastNonConfigurationInstance()
不是 null
,则将其转换为您的 AsyncTask
类并调用您的 setter 以将您的新 Activity 与任务相关联。
第 6 步:不要从 doInBackground()
中引用 Activity 数据成员。
如果你按照上面的方法,一切都会奏效。 onProgressUpdate()
和 onPostExecute()
在 onRetainNonConfigurationInstance()
开始和后续 onCreate()< 结束之间暂停
。
另一种方法是放弃 AsyncTask
并将您的工作转移到 IntentService
中。如果要完成的工作可能很长并且无论用户在 Activity 方面做什么(例如,下载大文件)都应该继续进行,这将特别有用。您可以使用有序广播 Intent
让 Activity 响应正在完成的工作(如果它仍在前台)或引发 Notification
让用户知道如果工作已经完成。 Here is a blog post有关此模式的更多信息。
关于android - 后台任务、进度对话框、方向更改 - 是否有任何 100% 可行的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3821423/
对于我的一个项目,我终于需要使用我的第一个多态类(std::cout 除外)。 我正在研究如何确保至少在某些情况下我有 100% 的去虚拟化调用。 这段代码是否合法可行? dynamic_cast 有
最近有一个编译问题,用这个片段说明: struct Base { }; template struct A : Base { A(){} A(Base&&) {} }; A foo()
注意:这是一个冗长的问题,需要对 MVVM“设计模式”、JSON 和 jQuery 有很好的理解.... 所以我有一个理论/主张 DHTML 中的 MVVM 是可能的 和可行的 并且想知道您是否同意/
我有一台 Mac 服务器,我正在构建 PHP 代码以允许用户上传图像、文档甚至视频文件。研究这个肯定让我很紧张,我希望上传的内容没有病毒。 自己构建一些东西会是一个巨大的挑战吗?您会这样做,还是会
根据文档,ASP.NET 项目(尚)不支持新的 PackageReference https://learn.microsoft.com/en-us/nuget/consume-packages/pa
我是一名优秀的程序员,十分优秀!