改变方向工作流程

时间:2014-05-19 20:49:29

标签: android multithreading android-asynctask

如果我有一个长时间运行的任务(如AsyncTask,或者甚至是一个使用MainLooper和处理程序将结果发回主线程的线程) 是否有可能在方向改变(从横向到纵向或反之亦然)未完全完成时执行正在运行的任务结果(在主线程上执行)?

例如,以下情况是否可能:

  1. 我开始活动
  2. 长时间运行的任务将开始
  3. 我将活动从纵向更改为横向
  4. 旧活动将被销毁
  5. 将执行长时间运行的任务结果(例如AsyncTask.onPostExecute();)
  6. 新活动将在风景中实现(由方向更改引起
  7. 所以我的问题是:

    我可以理所当然地认为,方向更改将在主线程上执行纵向活动和重新创建横向活动,而不在它们之间执行onPostExecute()吗?

    工作流程是否总是这样:

    1. 我开始活动
    2. 长时间运行的任务将开始
    3. 我将活动从纵向更改为横向
    4. 旧(肖像)活动将被销毁
    5. 新活动将在风景中实现(由方向更改引起)
    6. 将执行长时间运行的任务结果(例如AsyncTask.onPostExecute();)
    7. 或者像这样

      1. 我开始活动
      2. 长时间运行的任务将开始
      3. 将执行长时间运行的任务结果(例如AsyncTask.onPostExecute();)
      4. 我将活动从纵向更改为横向
      5. 旧(肖像)活动将被销毁
      6. 新活动将在风景中实现(由方向更改引起)
      7. 但绝不喜欢这样:

        1. 旧(肖像)活动将被销毁
        2. 将执行长时间运行的任务结果(例如AsyncTask.onPostExecute();)
        3. 新活动将在风景中实现(由方向更改引起)
        4. 我问,因为我不确定活动的破坏和重新创建是否会在MainLooper的单次运行中执行...很难测试它,因为它的时间很难重现。因此,专家知识在这一点上会很棒......它也可以用Fragment(即使用setRetainInstanceState)而不是Activity来实现

1 个答案:

答案 0 :(得分:0)

如果使用Fragment#setRetainInstanceState(boolean),那么即使在Activity重新创建之后,您也可以允许片段使AsyncTask保持活动状态。这被认为是执行此操作的最佳方式,最后的选择是在清单文件中设置configChanges="orientation|screenSize"