版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接:https://blog.csdn.net/XG1057415595/article/details/86774575
假設下面一種狀況:異步
當前Activity中持有一個fragment對象,且fragment中有一個AsyncTask異步任務正在執行,當配置發生改變時(好比屏幕旋轉),假設消息隊列的狀況以下.net
1.配置改變,用戶旋轉屏幕,可是此時AsyncTask已經運行
2.Fragment的onDetach方法被調用
3.AsyncTask的doInBackground方法完成,也就是後臺任務執行完畢
4.AsyncTask的onPostExecute方法被調用,在這個方法裏對UI進行更改
5.這時Fragment的onAttach方法才被調用線程
問題就是在Fragment被onDetach時,恰巧異步任務AsyncTask執行完畢後,onPostExecute對UI進行更改,會發生什麼?或是否會發生?對象
答案是:不會發生這種狀況!blog
配置改變發生時(屏幕旋轉等),在Fragment的onDetach和onAttach方法之間,onPostExecute方法不會被執行。生命週期
緣由以下:隊列
1.配置改變會發送一個message到主線程的消息隊列。消息隊列
2.當doInBackground方法執行完成時,AsyncTask經過發送一個message到主線程的消息隊列,以此來調用onPostExecute方法。it
3.配置改變時發送的message包含調用Activity和fragment生命週期方法的代碼(如onDetach()和onAttach())。AsyncTask的message包含調用onPostExecute()方法的代碼。由於主線程是順序處理消息隊列中的message的,因此不可能同時執行兩個message,因此onPostExecute()方法永遠不可能在onDetach()和onAttach()方法之間調用。後臺
———————————————— 版權聲明:本文爲CSDN博主「_SkUnK」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/XG1057415595/article/details/86774575