假设下面一种情况:
当前Activity中持有一个fragment对象,且fragment中有一个AsyncTask异步任务正在执行,当配置发生改变时(比如屏幕旋转),假设消息队列的情况如下
1.配置改变,用户旋转屏幕,但是此时AsyncTask已经运行
2.Fragment的onDetach方法被调用
3.AsyncTask的doInBackground方法完成,也就是后台任务执行完毕
4.AsyncTask的onPostExecute方法被调用,在这个方法里对UI进行更改
5.这时Fragment的onAttach方法才被调用
问题就是在Fragment被onDetach时,恰巧异步任务AsyncTask执行完毕后,onPostExecute对UI进行更改,会发生什么?或是否会发生?
答案是:不会发生这种情况!
配置改变发生时(屏幕旋转等),在Fragment的onDetach和onAttach方法之间,onPostExecute方法不会被执行。
原因如下:
1.配置改变会发送一个message到主线程的消息队列。
2.当doInBackground方法执行完成时,AsyncTask通过发送一个message到主线程的消息队列,以此来调用onPostExecute方法。
3.配置改变时发送的message包含调用Activity和fragment生命周期方法的代码(如onDetach()和onAttach())。AsyncTask的message包含调用onPostExecute()方法的代码。因为主线程是顺序处理消息队列中的message的,所以不可能同时执行两个message,所以onPostExecute()方法永远不可能在onDetach()和onAttach()方法之间调用。
喜欢点个赞~~
欢点个赞~~
点个赞~~
个赞~~
赞~~
~~
本文探讨了在Android中,当配置改变(如屏幕旋转)时,Activity中Fragment的AsyncTask执行顺序与UI更新的问题。解析了主线程消息队列如何确保在Fragment生命周期方法调用期间,AsyncTask的onPostExecute不会被执行,避免UI操作冲突。

431

被折叠的 条评论
为什么被折叠?



