AsyncTask 詳談 === `AsyncTask` **非同步任務**,或稱**異步任務**,是一個相當常用的類別,是專門用來處理背景任務與UI的類別。 **主執行緒**(Main Thread)又稱**UI執行緒**(UI Thread),任何有關UI的東西都在主執行緒中執行,Android 4.0 之後,有明文規定所有的網路行為都不能在主執行緒執行。 * 判斷現在是不是主值行緒在執行:透過 `Thread.currentThread().getId()` 若為`1`,則代表是主執行緒。 * 通常使用 `AsyncTask` 是因為它能夠與UI元件互通,因此大都以**內部類別**方式設計 * `AsyncTask<Params, Progress, Result>`,這是基本的架構,使用泛型來定義參數: * `Params` : 參數,你要餵什麼樣的參數給它。 * `Progress` : 進度條,進度條的資料型態要用哪種 * `Result` : 結果,你希望這個背景任務最後會有什麼樣的結果回傳給你。 EX:以第一個連結範例,丟入網址(`String`),進度條用整數(`Integer`),拿到圖片(`Bitmap`) * `AsyncTask` 的執行流程有四個階段: 1. `onPreExecute` : 主執行緒佔用,可與UI溝通。 2. `doInBackground` : 非主執行緒佔用,不可與UI溝通。 3. `onProgressUpdate` : 主執行緒佔用,可與UI溝通。 4. `onPostExecute` : 主執行緒佔用,可與UI溝通。 ```java= public class XX { class TestTask extends AsyncTask<Void, Void, Void>{ … } } ``` ## Ref. [AsyncTask - 非同步任務](http://aiur3908.blogspot.com/2015/06/android-asynctask.html) [AsyncTask-耗時工作設計](https://dotblogs.com.tw/hanktom/2016/01/26/191154) [AsyncTask-實作練習](https://dotblogs.com.tw/hanktom/2016/01/26/android-asynctask-practice) ###### tags: `執行緒`