Kotlin WorkManager使用方法詳解
WorkMananger的簡介
Google推出WorkManager組件,WorkManager很適合用于處理一些要求定時執(zhí)行的任務(wù),它可以根據(jù)操作系統(tǒng)的版本自動選擇底層是使用AlarmManager實(shí)現(xiàn)還是JobScheduler實(shí)現(xiàn),從而降低了我們的使用成本。另外,它還支持周期性任務(wù),鏈?zhǔn)饺蝿?wù)處理等功能,是一個非常強(qiáng)大的工具。
WorkManager的基本用法
在app/build.gradle文件添加依賴
implementation "androidx.work:work-runtime:2.7.1"
WorkManager的基本用法其實(shí)非常簡單,主要分為以下3步:
- 定義一個后臺任務(wù),并實(shí)現(xiàn)具體的任務(wù)邏輯。
- 配置該后臺任務(wù)的運(yùn)行條件和約束信息,并構(gòu)建后臺任務(wù)請求。
- 將該后臺任務(wù)請求傳入WorkManager的enqueue()方法中,系統(tǒng)會在合適的時間運(yùn)行。
第一步要定義一個后臺任務(wù),這里創(chuàng)建一個SimpleWorker類,代碼如下所示:
class SimpleWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { Log.d("SimpleWorker", "do work in SimpleWorker") return Result.success() } }
第二步,配置后臺任務(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)建出的后臺任務(wù)請求傳入WorkManager的enqueue()方法中,系統(tǒng)就會在合適的時間去運(yùn)行了,代碼如下所示:
WorkManager.getInstance(context).enqueue(request)
使用WorkManager處理復(fù)雜的任務(wù)
(1)讓后臺任務(wù)在指定的推遲時間后運(yùn)行
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java) .setInitialDelay(5,TimeUnit.MINUTES) .build()
(2)給后臺任務(wù)請求添加標(biāo)簽
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java) ... .addTag("simple") .build()
(3)通過標(biāo)簽來取消后臺任務(wù)請求
WorkManager.getInstance(this).cancelAllWorkByTag("simple")
(4)即使沒有標(biāo)簽,也可以通過id來取消后臺任務(wù)請求
WorkManager.getInstance(this).cancelAllWorkById(request.id)
(5) 一次性取消所有后臺任務(wù)請求
WorkManager.getInstance(this).cancelAllWork()
(6)如果后臺任務(wù)的doWork()方法中返回了Result.retry(),那么是可以結(jié)合setBackoffCriteria()方法來重新執(zhí)行任務(wù)的。
setBackoffCriteria():第一個參數(shù)用于指定如果任務(wù)失敗再次執(zhí)行失敗,下次重試的時間應(yīng)該以什么樣的形式延遲,可選值有兩種:1.LINEAR,代表下次重試時間以線性的方式延遲。2.EXPONENTIAL,代表下次重試時間以指數(shù)的方式延遲。第二個參數(shù)和第三個參數(shù)用于指定在多久之后重新執(zhí)行任務(wù),時間最短不能少于10秒鐘。
val request=OneTimeWorkRequest.Builder(SimpleWorker::class.java) ... .setBackoffCriteria(BackoffPolicy.LINEAR,10,TimeUnit.SECONDS) .build()
(7)doWork方法中返回Result.success()和Result.failure()又有什么作用?這兩個返回值其實(shí)就是用于通知任務(wù)運(yùn)行結(jié)果的,我們可以使用如下代碼對后臺任務(wù)的運(yùn)行結(jié)果進(jìn)行監(jiān)聽:
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個獨(dú)立的后臺任務(wù):同步數(shù)據(jù),壓縮數(shù)據(jù)和上傳數(shù)據(jù)。現(xiàn)在我們想要實(shí)現(xiàn)先同步,再壓縮,最后上傳的功能,就可以借助鏈?zhǔn)饺蝿?wù)來實(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android自定義Animation實(shí)現(xiàn)View搖擺效果
這篇文章主要為大家詳細(xì)介紹了Android自定義Animation實(shí)現(xiàn)View搖擺效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Android WiFi熱點(diǎn)開發(fā)的示例代碼
這篇文章主要介紹了Android WiFi熱點(diǎn)開發(fā)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Android RecycleView使用(CheckBox全選、反選、單選)
這篇文章主要為大家詳細(xì)介紹了Android RecycleView使用,CheckBox全選、反選、單選效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Android源碼學(xué)習(xí)之組合模式定義及應(yīng)用
將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得用戶對單個對象和組合對象的使用具有一致性,需要了解的朋友可以參考下2013-01-01Android 清除SharedPreferences 產(chǎn)生的數(shù)據(jù)(實(shí)例代碼)
項目是要保存上次文件播放的位置,我使用SharedPreferences來保存,鍵值對分別是文件路徑和當(dāng)時播放的位置2013-11-11Android實(shí)現(xiàn)簡單的答題系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡單的答題系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01Android PhotoView使用步驟實(shí)例詳解
這篇文章主要介紹了Android PhotoView使用步驟實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06