0

这是我试图解决三天的问题:

例如,REST 客户端应用程序执行大量后台工作(网络调用)并将结果发布回 UI 线程。很明显,它应该异步完成。Android 允许以多种方式执行此操作(例如 AsyncTasks 和 IntentServices)。

从活动运行异步任务的最大问题是配置更改。例如,我们有在 AsyncTask 中启动下载过程并显示 ProgressDialog 的活动。屏幕旋转后,操作系统正在重新创建活动。结果,当 asynctask 将尝试关闭旧(死)活动的进度对话框时,它将失败。

这个问题有几种解决方案:

  • 第一个是在工作片段中保留异步任务:很棒的帖子如何做到这一点在这里。此解决方案的一大优势是操作系统知道何时调用 onPostExecute() 方法。在某些情况下,onPostExecute() 可能会在旧活动被销毁而新活动仍未创建时调用。但这不会发生,因为操作系统不允许在调用 onAttach() 之前执行 onPostExecute()。缺点是 AsyncTasks 不适合长期操作,并且根据操作系统版本的不同表现不同。

  • 第二种方法是使用 LocalBroadcastManager 和 IntentService。这是另一篇文章,展示了如何使用它。如果服务在未注册时(重新创建活动的时刻)向 BroadcastReceiver 发送消息会发生什么?

  • 第三种解决方案是脏 hack:在 mainfest 中声明android:configChanges="keyboardHidden|orientation"。不适合我。

也许有人知道另一种解决方案?

4

1 回答 1

0

您可以使用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) 在任务之前阻止屏幕方向并在之后恢复它。

另一个想法是服务。您担心当一个方向关闭并且在另一个方向加载之前您可能会错过广播。在这种情况下,服务应该将数据存储在新活动可以加载的地方。(SqlLite,一个文件,sharedPrefs)

另请注意,broadcastRecievers 可以在清单中注册。所以永远在线,可以这么说。

于 2014-01-19T15:44:13.210 回答