標籤:http os 使用 sp 資料 on 代碼 ad bs
1、AsynTask類結構
asysTask類主要用到的幾個內部回呼函數有:
doInBackGround()
onPreExecute()
onPostExecute()
onProgressUpdate()
複製代碼
正是這幾個回呼函數構成了AsynTask類的使用邏輯結構。
注意:每個AsynTask子類必須至少複寫doInBackGround()方法。
2、回調邏輯關係
調用關係如:
1>主線程調用AsynTask子類執行個體的execute()方法後,首先會調用onPreExecute()方法。onPreExecute()在主線程中運行,可以用來寫一些開始提示代碼。
2>之後啟動新線程,調用doInBackground()方法,進行非同步資料處理。
3>處理完畢之後非同步線程結束,在主線程中調用onPostExecute()方法。onPostExecute()可以進行一些結束提示處理。
補充:在doInBackground()方法非同步處理的時候,如果希望通知主線程一些資料(如:處理進度)。這時,可以調用publishProgress()方法。這時,主線程會調用AsynTask子類的onProgressUpdate()方法進行處理。
3、各個函數間資料的傳遞
通過上面的調用關係,我們就可以大概看出一些資料傳遞關係。如下:
execute()向doInBackground()傳遞。
doInBackground()的傳回值會傳遞給onPostExecute()。
publishProgress()向progressUpdate()傳遞。
要點:為了調用關係明確及安全,AsynTask類在繼承時要傳入3個泛型。第一個泛型對應execute()向doInBackground()的傳遞類型。第二個泛型對應doInBackground()的傳回型別和傳遞給onPostExecute()的類型。第三個泛型對應publishProgress()向progressUpdate()傳遞的類型。
傳遞的資料都是對應類型的數組,數組都是可變長的哦。可以根據具體情況使用。
5、總結
初次看到這個非同步呼叫關係可能覺得很複雜,但其實熟悉了之後會發現這種結構很好用。這種結構將所有的線程通訊都封裝成回呼函數,調用邏輯容易書寫。尤其是在非同步處理結束之後,有回呼函數進行收尾處理。如果是使用Thread的run()方法,run()結束之後沒有傳回值。所以必須要自己建立通訊機制。但是,其實使用Handler+Thread機制其實完全可以替代AsynTask的這種調用機制。只要將Handler對象傳給Thread,就可以進行方便的非同步處理。且這種MVC模式結構更加明顯,方便管理。所以我覺得,使用asynTask還是Handler+Thread結構,個人喜好吧。但是有一點可以明顯能感覺到得是,Handler+Thread適合進行大架構的非同步處理,而asynTask適用於小型簡單的非同步處理。以上都是個人觀點+理解。有新觀點請指出。
非同步任務類繼承時有三個泛型型別,第一個類型是主線程中excute時的參數類型,也是doInBackground方法的參數類型;第二個參數類型是在doInBackground方法中調用publishProgress方法時的參數類型,也是onProgressUpdate的參數類型;第三個參數類型是doInBackground的傳回值類型,也是onPostExecute方法的參數類型(也是onCancelled(T result)方法參數類型,這個方法需要API 11以上)。
安卓非同步任務AsynTask(1)