---
# System prepended metadata

title: AsyncTask 詳談
tags: [執行緒]

---

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: `執行緒`