我在后台线程(我用AsyncTask)从互联网上下载了一些数据,下载时会显示进度对话框.方向更改,活动重新启动,然后我的AsyncTask完成-我想取消进度对话框并开始新的活动.但是调用disdissDialog有时会抛出异常(可能是因为活动已被销毁,而新活动尚未启动).

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

推荐答案

第一步:让你的AsyncTask成为一个static嵌套类,或者一个完全独立的类,而不是一个内部(非静态嵌套)类.

步骤2:让AsyncTask通过数据成员(通过构造函数和设置器设置)保持在Activity上.

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

第4步:在onRetainNonConfigurationInstance()中,将AsyncTask从原来的、现在要离开的活动中分离出来,然后将其返回.

第5步:在onCreate()中,如果getLastNonConfigurationInstance()不是null,则将其投射到AsyncTask班,并打电话给你的设定者,将你的新活动与任务联系起来.

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

如果你遵循上面的食谱,一切都会奏效的.onProgressUpdate()onPostExecute()onRetainNonConfigurationInstance()的开始和随后的onCreate()的结束之间暂停.

Here is a sample project人演示这项技术.

另一种方法是抛弃AsyncTask,把你的作品换成IntentService.如果要完成的工作可能很长,并且无论用户在活动方面做了什么(例如下载一个大文件),都应该继续进行,这一点尤其有用.您可以使用有序广播Intent让活动对正在完成的工作做出响应(如果它仍在前台),或者使用Notification让用户知道工作是否已经完成.Here is a blog post,更多关于这个图案.

Android相关问答推荐

ArrayList.remove()(Kotlin中的removeAt())导致奇怪的IndexOutOfBoundsResponse异常

如何在Jetpack导航中不显示目的地?

Android,从C++调用的铁 rust 库缺少符号

如何更新Kotlin中的显示?

Android 11:在try 获取文件的永久权限后,仍然没有读写权限

如何在Android中打印到命令行

在 kotlin 协同 routine 中,如何将数据范围限定为请求路径(以 MDC 为例)?

当 EditText 用于在 android studio 中将字符串发送到 firebase 时,仅允许安全调用错误

Jetpack Compose 如何使一个项目相对于另一个项目垂直居中

在 MVVM Jetpack Compose 上添加依赖项时出现重复类错误

在模块 jetified-kotlin-stdlib-1.8.10 中发现重复的类 kotlin.random.jdk8,带有启动基准

设置背景图片组成Column

了解 Compose 声明性逻辑

Jetpack compose :使用 rememberSaveable 时未应用待处理的合成

如何使用 ConstraintLayout 链接两个文本

无法使用 Gradle 托管设备对基线配置文件运行测试

如何在不使用 NestedScrollView 的情况下使用带有 CollapsingToolbar 的 ViewPager?

如何让用户与任意应用程序共享文件?

Android Studio,Db 连接错误:发生异常情况导致驱动程序失败.请报告此异常

Android TTS 在屏幕关闭一段时间后停止朗读