網站首頁 編程語言 正文
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
相關推薦
- 2023-12-12 線程死鎖的概念及其解決方法
- 2022-03-24 一篇文章教你如何用C語言實現strcpy和strlen_C 語言
- 2023-02-27 一文搞懂Golang?值傳遞還是引用傳遞_Golang
- 2022-08-28 詳解Python獲取線程返回值的三種方式_python
- 2022-07-30 python實現網上購物系統_python
- 2022-10-18 ASP.NET?MVC增加一條記錄同時添加N條集合屬性所對應的個體_實用技巧
- 2022-11-06 YOLOv5改進系列之增加小目標檢測層_python
- 2022-12-15 Golang并發編程深入分析_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支