Android 內建的 AsyncTask 類別,用來處理耗時的背景作業,為非同步任務,且提供方法可以與主執行緒互動。
(關於執行緒可以參考 官方參考資料)
# 一個實例化的 AsyncTask 只能執行一次
要使用 AsyncTask 類別需建立一個 class 繼承 AsyncTask 並指定三個泛型參數
AsyncTask <Params, Progress, Result>
class ProgressTask: AsyncTask<Context, Int, Int>() {}
Params:想傳入 AsyncTask 類別並在背景執行時做使用的參數類型
Progress:將在執行中將進度回傳給 UI thread 的進度單位類型
Result:傳遞執行結果的返回類型
# 若無參數類型需要指定可寫為 Void,如:AsyncTask<Void, Void, Void>
這三個泛型參數將在 AsyncTask 的方法中被使用
以下將介紹 AsyncTask 類別中的方法
僅類別本身及繼承此類別的子類別可使用這些方法
在背景作業開始前於主執行緒執行的方法
在背景執行緒執行的背景作業
doInBackground (vararg params: Params): Result
override fun doInBackground(vararg context: Context): Int {
while ( progressBar.progress < progressBar.max ){
Thread.sleep(500) // 背景執行緒暫停 500 毫秒後執行下面動作
progressBar.incrementProgressBy(10)
publishProgress()
}
return progressBar.progress
}
vararg:表示參數為可變數量參數,也就是傳入的參數可以為多個同類型的參數
params:透過 execute 方法執行背景作業時傳入的參數,這裡傳入的參數類型即為繼承時設置的 Params 類型。
( execute 方法將在下面介紹)
回傳結果,回傳的類型即為繼承時設置的 Result 類型,AsyncTask 類別中有些方法會接收這個回傳值(例如下面會提到的 onPostExecute 方法)。
用來觸發 onProgressUpdate 方法
publishProgress (vararg values: Progress)
values:要傳遞給 onProgressUpdate 方法的進度值,類型為繼承時設置的 Progress 類型。
可以在 doInBackground 方法中呼叫此方法,用來在背景作業執行過程中調用 onProgressUpdate 方法以更新 UI 畫面(顯示目前進度等等),或執行必須要在主執行緒處理的事情。
於主執行緒執行
背景作業執行過程中用來更新 UI 畫面或是處理要在主執行緒處理的事情的方法。
onProgressUpdate (vararg values: Progress)
override fun onProgressUpdate(vararg values: Int?) {
super.onProgressUpdate(*values)
textView.setText("${progressBar.progress} %")
}
values:透過 publishProgress 方法傳入的進度值,類型為繼承時設置的 Progress 類型。
透過 doInBackground 方法中呼叫 publishProgress 方法觸發此方法
在背景作業執行完後於主執行緒執行的方法
onPostExecute (result: Result)
可被外部使用的方法
執行實例化的 AsyncTask 類別,必須要由主執行緒使用此方法
execute (vararg params: Params)
params:想傳入 doInBackground 方法供其使用的參數,可為多個同類型的參數
一個實例化的 AsyncTask 類別只能被執行一次,已被取消或已完成的 AsyncTask 任務將不能被再次執行,因此若要再次執行須重新實例化一個新的 AsyncTask 類別並對其執行 execute 方法
progressTask.execute(this)
取得 AsyncTask 任務的狀態
getStatus (): AsyncTask.Status
回傳的 AsyncTask.Status 有以下三種可能
FINISHED:AsyncTask 任務已執行完畢(onPostExecutet 方法已執行完)。
PENDING:AsyncTask 任務尚未被執行。
RUNNING:AsyncTask 任務正在執行中。
if(progressTask.status == AsyncTask.Status.RUNNING){
Toast.makeText(this, "程序已在執行中", Toast.LENGTH_LONG).show()
}
取消執行中的 AsyncTask 任務
cancel (mayInterruptIfRunning: Boolean): Boolean
mayInterruptIfRunning:正在執行的 AsyncTask 任務是否要被中斷並取消,設 true 的話為中斷並取消。
回傳 Boolean 值:若 AsyncTask 任務無法被取消會回傳 false(例如該任務已被完成),若可取消則回傳 true
已被取消的 AsyncTask 任務無法被再次被執行,因此要再執行一樣的任務需要重新實例化 AsyncTask 類別,再對新的實例化對象執行 execute 方法
progressTask.cancel(true)
Android
Kotlin
AsyncTask