# AsyncTask耗時工作

## 使用方法

通常寫成內部類別，方便與UI進行互動，形如AsyncTask<傳入值型態, 進度值型態, 回傳值型態>，傳入的型態如String, Integer, Float, Boolean，如果不需要傳入參數的話，寫Void(大寫V)。

定義完型態，接著覆寫doInBackground()

```java
class TestTask extends AsyncTask<Void, Void, Void>
{    
    TestTask(Context context, JSONObject result)
    {
        //也可以這樣傳入參數
        ...
    }
    @Override
    protexted Boolean doInBackground(Void... params)
    {
        //do something
        return null;
    }
}
```

執行的時候建立出testTask物件，執行execute()就行了。execute()裡面可以填入需要的參數。執行execute()後相當於執行了doInBackground()。

```
TestTask testTask = new TestTask();
testTask.execute();
```

## 與UI Thread的互動

有三個方法可以與UI Thread互動，包括onPreExecute(之前)、onProgressUpdate(過程)、onPostExecute(之後)

1.背景工作之前做的事放在onPreExecute()

2.背景工作執行過程中更新狀態的邏輯放在onProgressUpdate()，在doInBackground()可以呼叫publishProgress()方法自動執行onProgressUpdate()。

3.執行完背景工作後，會執行onPostExecute()

除了doInBackground()之外，三個方法裡面都能夠與UI Thread互動。
