Android UI 线程消息队列调度顺序

标签 android android-asynctask

虽然在 Android 中使用 retain Fragments 在配置更改期间保存 AsyncTask,我想这是最好的方法,但我对 UI Thread 的消息队列调用顺序产生了一些疑问。

例如: 想象一下这种情况:

  1. 发生配置更改,用户旋转设备。 AsyncTask 正在运行。
  2. fragment onDetach()被调用
  3. AsyncTask doInBackground() 方法完成
  4. AsyncTask onPostExecute()被调用
  5. fragment onAttach()被调用

UI线程消息队列也可以这样:

Queue top -> onDetach() | onPostExecute() | onAttach()

我知道它不能,据我所知,对 onPostExecute() 的调用将等到配置更改完成,但它是如何工作的?来自 Activity 、 fragment 生命周期的调用是否连续执行?

最佳答案

Fragment#onDetach()Fragment#onAttach() 之间不能调用 onPostExecute()配置更改。这种说法背后的原因有三个:

  1. 配置更改在主线程消息队列中的单个消息内处理。

  2. 只要 doInBackground() 方法返回,AsyncTask 就会安排 onPostExecute() 方法在主线程通过向主线程的消息队列发布消息。

  3. 配置更改的消息将包含将调用 ActivityFragment 生命周期方法的代码(例如 onDetach()onAttach())。 AsyncTask 的消息将包含调用 onPostExecute() 方法的代码。由于主线程按顺序处理其消息队列中的消息,两条消息不可能同时执行,因此在调用 onPostExecute() 之间永远不能调用 >onDetach()onAttach()

阅读我在 this thread 中对 Doug Stevenson 的回复以获得更详细的解释(包括证明该声明的源代码的链接)。

关于Android UI 线程消息队列调度顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964180/

相关文章:

android - 如何检测Android屏幕方向改变

java - 如何发送整数和字符串作为 JsonObjectRequest 的参数 (Android)

java - 当 JSON 解析器找不到 JSON 对象时如何设置条件

java - 如果我有 1 个服务器和多个客户端,我是否需要 SocketServerChannel?

android - 使用 AsyncTask 作为内部类的内存泄漏

java - Android 异步任务 : Will methods that are called inside doInBackground() executed in main or background thread?

android - 如何在android中实现类似谷歌翻译器的音频文件中的转换文本语音收听

android - 显示 DialogFragments 会使 ICS 崩溃

java - 如何在 onCreate 完成之前显示内容 - Android

android - 在android中启动asynctask的参数是什么