这是我试图解决三天的问题:
例如,REST 客户端应用程序执行大量后台工作(网络调用)并将结果发布回 UI 线程。很明显,它应该异步完成。Android 允许以多种方式执行此操作(例如 AsyncTasks 和 IntentServices)。
从活动运行异步任务的最大问题是配置更改。例如,我们有在 AsyncTask 中启动下载过程并显示 ProgressDialog 的活动。屏幕旋转后,操作系统正在重新创建活动。结果,当 asynctask 将尝试关闭旧(死)活动的进度对话框时,它将失败。
这个问题有几种解决方案:
第一个是在工作片段中保留异步任务:很棒的帖子如何做到这一点在这里。此解决方案的一大优势是操作系统知道何时调用 onPostExecute() 方法。在某些情况下,onPostExecute() 可能会在旧活动被销毁而新活动仍未创建时调用。但这不会发生,因为操作系统不允许在调用 onAttach() 之前执行 onPostExecute()。缺点是 AsyncTasks 不适合长期操作,并且根据操作系统版本的不同表现不同。
第二种方法是使用 LocalBroadcastManager 和 IntentService。这是另一篇文章,展示了如何使用它。如果服务在未注册时(重新创建活动的时刻)向 BroadcastReceiver 发送消息会发生什么?
第三种解决方案是脏 hack:在 mainfest 中声明
android:configChanges="keyboardHidden|orientation"
。不适合我。
也许有人知道另一种解决方案?