处理后台任务和活动配置更改

时间:2014-01-19 12:02:37

标签: android android-fragments android-asynctask android-service android-configchanges

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

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

从活动运行异步任务的最大问题是配置更改。 例如,我们有在AsyncTask中启动下载过程的活动,并显示ProgressDialog。屏幕旋转后,OS正在重新创建活动。结果当asynctask试图解除旧(死)活动的progressdialog时,它将失败。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)阻止任务前的屏幕方向,然后将其恢复。

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

另请注意,broadcastRecievers可以在清单中注册。总是这样,可以这么说。