整個過程有點複雜,認真理解下,還是覺得設計得挺好的。
異步操作 AsyncTask
對於耗時較多的操作(如網絡操作等)因爲會消耗時間而使程序阻塞,那麼應該採用異步線程才進行。
實現一個繼承AsyncTask 異步操作的類。覆蓋doInBackground方法
採取不直接調用所要進行的操作,而是在doInbackground中實現。
實例化一個AsyncTask的繼承類,然後調用其execute()方法即可。那麼耗時操作就在新的線程中執行了,如果遭遇阻塞將不會影響到UI線程。
AsyncTask:
execute()
onPreExecute():在UI線程中執行,進行異步線程執行之前的UI準備工作
onPostExecute():在UI線程中執行,那麼可以控制UI控件
doInBackground():無法控制UI,因爲它是在另外一個線程中執行的,在這個方法裏我們執行耗時操作,並通過調用publicProgress()進而調用onProgressUpdate()方法,從而更新UI。
onProgressUpdate():在異步任務執行過程中對UI進行修改
生成AsyncTask對象之後,執行execute(),首先執行的是onPreExecute(),然後是doInBackground(),中間會調用onProgressUpdate(),最後是onPostExecute()。其中,doInBackground()是在一個新的進程中執行的。
在doInBackground()調用publishProgress()將會調用onProgressUpdate(),從而更新UI。從這點看,publishProgress的作用是進程間通信。
doInBackground()的參數是來自調用execute()得到的參數,也是AsyncTask三個參數中的第一個。
doInBackground()的返回值由AsyncTask的第三個參數決定,這個返回值會作爲onPostExecute()的參數。
onProgressUpdate()的參數來自publishProgress()的參數,由第二個類型參數定義