日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Kotlin?WorkManager使用方法詳解_Android

作者:Hdnw ? 更新時間: 2023-03-19 編程語言

WorkMananger的簡介

Google推出WorkManager組件,WorkManager很適合用于處理一些要求定時執行的任務,它可以根據操作系統的版本自動選擇底層是使用AlarmManager實現還是JobScheduler實現,從而降低了我們的使用成本。另外,它還支持周期性任務,鏈式任務處理等功能,是一個非常強大的工具。

WorkManager的基本用法

在app/build.gradle文件添加依賴

?implementation "androidx.work:work-runtime:2.7.1"

WorkManager的基本用法其實非常簡單,主要分為以下3步:

  • 定義一個后臺任務,并實現具體的任務邏輯。
  • 配置該后臺任務的運行條件和約束信息,并構建后臺任務請求。
  • 將該后臺任務請求傳入WorkManager的enqueue()方法中,系統會在合適的時間運行。

第一步要定義一個后臺任務,這里創建一個SimpleWorker類,代碼如下所示:

class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    override fun doWork(): Result {
        Log.d("SimpleWorker", "do work in SimpleWorker")
        return Result.success()
    }
}

第二步,配置后臺任務的運行條件和約束信息,代碼如下所示:

 //設置約束條件
 //NetworkType.CONNECTED 最通用的連上網絡
 //NetworkType.UNMETERED  WF
 //NetworkType.METERED 流量,4G
  val constraints: Constraints =Constraints.Builder()
       .setRequiredNetworkType(NetworkType.CONNECTED)
       .build()
  val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
        .setConstraints(constraints)
        .build()

最后一步,將構建出的后臺任務請求傳入WorkManager的enqueue()方法中,系統就會在合適的時間去運行了,代碼如下所示:

WorkManager.getInstance(context).enqueue(request)

使用WorkManager處理復雜的任務

(1)讓后臺任務在指定的推遲時間后運行

val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
                .setInitialDelay(5,TimeUnit.MINUTES)
                .build()

(2)給后臺任務請求添加標簽

val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
                ...
                .addTag("simple")
                .build()

(3)通過標簽來取消后臺任務請求

WorkManager.getInstance(this).cancelAllWorkByTag("simple")

(4)即使沒有標簽,也可以通過id來取消后臺任務請求

WorkManager.getInstance(this).cancelAllWorkById(request.id)

(5) 一次性取消所有后臺任務請求

WorkManager.getInstance(this).cancelAllWork()

(6)如果后臺任務的doWork()方法中返回了Result.retry(),那么是可以結合setBackoffCriteria()方法來重新執行任務的。

setBackoffCriteria():第一個參數用于指定如果任務失敗再次執行失敗,下次重試的時間應該以什么樣的形式延遲,可選值有兩種:1.LINEAR,代表下次重試時間以線性的方式延遲。2.EXPONENTIAL,代表下次重試時間以指數的方式延遲。第二個參數和第三個參數用于指定在多久之后重新執行任務,時間最短不能少于10秒鐘。

val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
                ...
                .setBackoffCriteria(BackoffPolicy.LINEAR,10,TimeUnit.SECONDS)
                .build()

(7)doWork方法中返回Result.success()和Result.failure()又有什么作用?這兩個返回值其實就是用于通知任務運行結果的,我們可以使用如下代碼對后臺任務的運行結果進行監聽:

WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id).observer(this){workInfo->
    if(workInfo.state==WorkInfo.State.SUCCEEDED){
        Log.d("MainActivity","do work succeeded")
    }else if(workInfo.state==WorkInfo.State.FAILED){
         Log.d("MainActivity","do work failed")
    }
}

鏈式任務

假如這里定義了3個獨立的后臺任務:同步數據,壓縮數據和上傳數據。現在我們想要實現先同步,再壓縮,最后上傳的功能,就可以借助鏈式任務來實現。

val sync=...
val compress=...
val upload=...
WorkManager.getInstance(this)
   .beginWith(sync)
   .then(compress)
   .then(upload)
   .enqueue()

原文鏈接:https://blog.csdn.net/weixin_63357306/article/details/127195294

欄目分類
最近更新