【问题标题】:Handling background tasks and activity configuration changes处理后台任务和活动配置更改
【发布时间】:2014-01-19 12:02:36
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多