close

今天來講講 Android Jetpack 中的 WorkManager 

WorkManager 是一個很好用的東西

它可以輕鬆地讓初始任務逐步執行或是指定何時運行

我們可以使用 WorkManager API 設置一個或多個任務並指定條件

WorkManager 就會在符合條件時執行任務 (ex. 時間、充電、有網路…等條件)

我們可以通過觀察任務的 LiveData 來檢查任務的狀態以及它的返回值

而且,就算應用程序被強制退出或設備重新啟動,任務仍然可以保證運行

 

知道了什麼是 WorkManager 那我們就來試試怎麼用吧

首先引入 Library

def work_version = "2.2.0"

// (Java only)
implementation "androidx.work:work-runtime:$work_version"

// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"

// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"

// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"

// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"

這是官方的 Gradle 範例

我們可以挑自己需要的 implementation 就好

 

然後要建立自己的 Worker

這裡我建立一個 Upload Image 的 Worker

Class 繼承 Worker 後,將要做的事情寫在 doWork() 裡

之後依處理情況去返回值 Result.success / failure / retry

class UploadWorker(appContext: Context, workerParams: WorkerParameters)
    : Worker(appContext, workerParams) {

    override fun doWork(): Result {
        val isSuccess = uploadImages()

        if (isSuccess)
            return Result.success()
        else
            return Result.failure()
    }
}

 

之後用我們剛剛建立的 UploadWorker 去創造一個 WorkRequest

WorkManager 可以持有多個 WorkRequest 並依序執行

val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
        .build()
WorkManager.getInstance(myContext).enqueue(uploadWorkRequest)

完成上面的步驟,我們的 task 就可以運行囉

是不是很簡單

少了很多繁復的動作 (如 os api 版本、裝置…等判斷)

 

最後,在文章的開頭

我們不是說可以設定 Worker 的條件嗎?

這個我們可以在 Build WorkRequest 這一步來設定

如下,建立 Constraints 塞進 Request 即可

val constraints = Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        .build()

val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>()
        .setConstraints(constraints)
        .build()

至於 Constraints 有什麼 method 我們可以到下方連結查看

點我查看 Constraints.method()

除了基本的 延遲、間隔… 還有很多其它的 constraint 可以用

大家可以去找自己需要的 constraint 喔

 

 

 

資料來源:

https://developer.android.com/jetpack/androidx/releases/work

https://developer.android.com/topic/libraries/architecture/workmanager/basics

https://developer.android.com/topic/libraries/architecture/workmanager/how-to/define-work

https://developer.android.com/reference/androidx/work/Constraints.Builder


arrow
arrow

    顏澤偉 發表在 痞客邦 留言(0) 人氣()