iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 15
0

<< 接續上篇

Method


AsyncTask

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 類別中的方法

Protected Method


僅類別本身及繼承此類別的子類別可使用這些方法

  • onPreExecute

    在背景作業開始前於主執行緒執行的方法

  • doInBackground

    背景執行緒執行的背景作業

    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 方法)。

  • publishProgress

    用來觸發 onProgressUpdate 方法

    publishProgress (vararg values: Progress)

    • values:要傳遞給 onProgressUpdate 方法的進度值,類型為繼承時設置的 Progress 類型。

    • 可以在 doInBackground 方法中呼叫此方法,用來在背景作業執行過程中調用 onProgressUpdate 方法以更新 UI 畫面(顯示目前進度等等),或執行必須要在主執行緒處理的事情。

  • onProgressUpdate

    主執行緒執行

    背景作業執行過程中用來更新 UI 畫面或是處理要在主執行緒處理的事情的方法。

    onProgressUpdate (vararg values: Progress)

    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        textView.setText("${progressBar.progress} %")
      }
    
    • values:透過 publishProgress 方法傳入的進度值,類型為繼承時設置的 Progress 類型。

    • 透過 doInBackground 方法中呼叫 publishProgress 方法觸發此方法

  • onPostExecute

    在背景作業執行完後於主執行緒執行的方法

    onPostExecute (result: Result)

    • result:為 doInBackground 方法執行完後回傳的結果,類型為繼承時設置的 Result 類型。

Public Method


可被外部使用的方法

  • execute

    執行實例化的 AsyncTask 類別,必須要由主執行緒使用此方法

    execute (vararg params: Params)

    • params:想傳入 doInBackground 方法供其使用的參數,可為多個同類型的參數

    • 一個實例化的 AsyncTask 類別只能被執行一次,已被取消或已完成的 AsyncTask 任務將不能被再次執行,因此若要再次執行須重新實例化一個新的 AsyncTask 類別並對其執行 execute 方法

    progressTask.execute(this)
    
  • getStatus

    取得 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()
    }
    
  • cancel

    取消執行中的 AsyncTask 任務

    cancel (mayInterruptIfRunning: Boolean): Boolean

    • mayInterruptIfRunning:正在執行的 AsyncTask 任務是否要被中斷並取消,設 true 的話為中斷並取消。

    • 回傳 Boolean 值:若 AsyncTask 任務無法被取消會回傳 false(例如該任務已被完成),若可取消則回傳 true

    • 已被取消的 AsyncTask 任務無法被再次被執行,因此要再執行一樣的任務需要重新實例化 AsyncTask 類別,再對新的實例化對象執行 execute 方法

    progressTask.cancel(true)
    

實作成果

查看詳細 Code > GitHub

tags: Android Kotlin AsyncTask

上一篇
Android Kotlin 實作 Day 10:ProgressControl(上)(ProgressBar)
下一篇
Android Kotlin 實作 Day 11:DAY11_Alarm(上)(Calendar)
系列文
英國研究顯示,連續30天用Kotlin開發Android將有益於身心健康30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言