今天來講講 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 我們可以到下方連結查看
除了基本的 延遲、間隔… 還有很多其它的 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
留言列表