Kotlin WorkManager使用方法詳解
WorkMananger的簡(jiǎn)介
Google推出WorkManager組件,WorkManager很適合用于處理一些要求定時(shí)執(zhí)行的任務(wù),它可以根據(jù)操作系統(tǒng)的版本自動(dòng)選擇底層是使用AlarmManager實(shí)現(xiàn)還是JobScheduler實(shí)現(xiàn),從而降低了我們的使用成本。另外,它還支持周期性任務(wù),鏈?zhǔn)饺蝿?wù)處理等功能,是一個(gè)非常強(qiáng)大的工具。
WorkManager的基本用法
在app/build.gradle文件添加依賴
implementation "androidx.work:work-runtime:2.7.1"
WorkManager的基本用法其實(shí)非常簡(jiǎn)單,主要分為以下3步:
- 定義一個(gè)后臺(tái)任務(wù),并實(shí)現(xiàn)具體的任務(wù)邏輯。
- 配置該后臺(tái)任務(wù)的運(yùn)行條件和約束信息,并構(gòu)建后臺(tái)任務(wù)請(qǐng)求。
- 將該后臺(tái)任務(wù)請(qǐng)求傳入WorkManager的enqueue()方法中,系統(tǒng)會(huì)在合適的時(shí)間運(yùn)行。
第一步要定義一個(gè)后臺(tái)任務(wù),這里創(chuàng)建一個(gè)SimpleWorker類,代碼如下所示:
class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
Log.d("SimpleWorker", "do work in SimpleWorker")
return Result.success()
}
}第二步,配置后臺(tái)任務(wù)的運(yùn)行條件和約束信息,代碼如下所示:
//設(shè)置約束條件
//NetworkType.CONNECTED 最通用的連上網(wǎng)絡(luò)
//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()最后一步,將構(gòu)建出的后臺(tái)任務(wù)請(qǐng)求傳入WorkManager的enqueue()方法中,系統(tǒng)就會(huì)在合適的時(shí)間去運(yùn)行了,代碼如下所示:
WorkManager.getInstance(context).enqueue(request)
使用WorkManager處理復(fù)雜的任務(wù)
(1)讓后臺(tái)任務(wù)在指定的推遲時(shí)間后運(yùn)行
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
.setInitialDelay(5,TimeUnit.MINUTES)
.build()(2)給后臺(tái)任務(wù)請(qǐng)求添加標(biāo)簽
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.addTag("simple")
.build()(3)通過(guò)標(biāo)簽來(lái)取消后臺(tái)任務(wù)請(qǐng)求
WorkManager.getInstance(this).cancelAllWorkByTag("simple")(4)即使沒(méi)有標(biāo)簽,也可以通過(guò)id來(lái)取消后臺(tái)任務(wù)請(qǐng)求
WorkManager.getInstance(this).cancelAllWorkById(request.id)
(5) 一次性取消所有后臺(tái)任務(wù)請(qǐng)求
WorkManager.getInstance(this).cancelAllWork()
(6)如果后臺(tái)任務(wù)的doWork()方法中返回了Result.retry(),那么是可以結(jié)合setBackoffCriteria()方法來(lái)重新執(zhí)行任務(wù)的。
setBackoffCriteria():第一個(gè)參數(shù)用于指定如果任務(wù)失敗再次執(zhí)行失敗,下次重試的時(shí)間應(yīng)該以什么樣的形式延遲,可選值有兩種:1.LINEAR,代表下次重試時(shí)間以線性的方式延遲。2.EXPONENTIAL,代表下次重試時(shí)間以指數(shù)的方式延遲。第二個(gè)參數(shù)和第三個(gè)參數(shù)用于指定在多久之后重新執(zhí)行任務(wù),時(shí)間最短不能少于10秒鐘。
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java)
...
.setBackoffCriteria(BackoffPolicy.LINEAR,10,TimeUnit.SECONDS)
.build()(7)doWork方法中返回Result.success()和Result.failure()又有什么作用?這兩個(gè)返回值其實(shí)就是用于通知任務(wù)運(yùn)行結(jié)果的,我們可以使用如下代碼對(duì)后臺(tái)任務(wù)的運(yùn)行結(jié)果進(jìn)行監(jiān)聽(tīng):
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")
}
}鏈?zhǔn)饺蝿?wù)
假如這里定義了3個(gè)獨(dú)立的后臺(tái)任務(wù):同步數(shù)據(jù),壓縮數(shù)據(jù)和上傳數(shù)據(jù)?,F(xiàn)在我們想要實(shí)現(xiàn)先同步,再壓縮,最后上傳的功能,就可以借助鏈?zhǔn)饺蝿?wù)來(lái)實(shí)現(xiàn)。
val sync=... val compress=... val upload=... WorkManager.getInstance(this) .beginWith(sync) .then(compress) .then(upload) .enqueue()
到此這篇關(guān)于Kotlin WorkManager使用方法詳解的文章就介紹到這了,更多相關(guān)Kotlin WorkManager內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android進(jìn)程間通信(IPC)機(jī)制Binder簡(jiǎn)要介紹
本文主要介紹 Android進(jìn)程間通信(IPC)機(jī)制Binder簡(jiǎn)要介紹, 這里介紹了Binder機(jī)制如何實(shí)現(xiàn)進(jìn)程通信機(jī)制,有研究Android源碼的朋友可以看下2016-08-08
Android實(shí)現(xiàn)動(dòng)態(tài)圓環(huán)的圖片頭像控件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶有動(dòng)態(tài)圓環(huán)的圓形圖片控件DynamicAvatarView的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
談?wù)凙ndroid里的Context的使用實(shí)例
這篇文章主要介紹了談?wù)凙ndroid里的Context的使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-11-11
Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)
現(xiàn)在很多項(xiàng)目都需要集成百度地圖,所以就把自己做過(guò)一個(gè)項(xiàng)目的經(jīng)驗(yàn)寫出來(lái)和大家分享,方便自己和大家使用的時(shí)候參考借鑒,下面就來(lái)一起看看Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)吧。2016-09-09
Android中退出確認(rèn)框的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中退出確認(rèn)框的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android 屏幕切換監(jiān)聽(tīng)的實(shí)例代碼
我試著在屏幕切換時(shí),使View顯示在不同的位置,在網(wǎng)上搜索了一些資料,自己做了一段時(shí)間,終于完成了功能,今天小編給大家分享android 屏幕切換監(jiān)聽(tīng)的實(shí)例代碼,需要的的朋友參考下吧2017-01-01
Android自定義流式布局實(shí)現(xiàn)淘寶搜索記錄
這篇文章主要為大家詳細(xì)介紹了Android自定義流式布局實(shí)現(xiàn)淘寶搜索記錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

