android - 改变方向的工作流程

标签 android multithreading android-asynctask

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

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

  • 我开始 Activity
  • 长时间运行的任务将启动
  • 我将 Activity 从肖像改为风景
  • 旧 Activity 将被破坏
  • 长时间运行的任务结果将被执行(例如AsyncTask.onPostExecute();)
  • 新 Activity 将在横向实例化(由方向更改引起)

  • 所以我的问题是:

    我可以认为这是理所当然的,方向更改将在主线程上执行肖像 Activity 的破坏和景观 Activity 的重新创建,而无需在它们之间执行onPostExecute()吗?

    工作流程是否总是这样:
  • 我开始 Activity
  • 长时间运行的任务将启动
  • 我将 Activity 从肖像改为风景
  • 旧的(肖像) Activity 将被破坏
  • 新 Activity 将在横向实例化(由方向变化引起)
  • 长时间运行的任务结果将被执行(例如AsyncTask.onPostExecute();)

  • 或像这样
  • 我开始 Activity
  • 长时间运行的任务将启动
  • 长时间运行的任务结果将被执行(例如AsyncTask.onPostExecute();)
  • 我将 Activity 从肖像改为风景
  • 旧的(肖像) Activity 将被破坏
  • 新 Activity 将在横向实例化(由方向变化引起)

  • 但从来没有像这样:
  • 旧的(肖像) Activity 将被破坏
  • 长时间运行的任务结果将被执行(例如AsyncTask.onPostExecute();)
  • 新 Activity 将在横向实例化(由方向变化引起)

  • 我问是因为我不确定是否要在MainLooper上一次运行来破坏和重新创建 Activity ...很难对其进行测试,因为它的时间很难重现。因此,在这一点上,专家知识将是很棒的……它也可以使用Fragment(即,使用setRetainInstanceState)而不是Activity来实现

    最佳答案

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

    关于android - 改变方向的工作流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746967/

    相关文章:

    java - Intent 的 RecyclerView 中未检测到 OnClick

    java - 循环未从 java 中的 actionPerformed 获取更新的 boolean 值

    Android 下载多个文件并在 ListView 中显示进度

    java - Android Room 通用 DAO

    android - 恢复 Facebook 3 SDK session

    Android LocationListener,onStatusChanged 和 onProviderDisabled 上的 AbstractMethodError

    android - 基本网络.performRequest : Unexpected response code 401 android Volley library

    java - 在给定时间后跳到带有线程的 for 循环中的下一个索引

    Java多线程控制

    java - android asynctask处理程序如何正确创建它加上奇怪的无法销毁 Activity 异常