首先灰常感謝各位觀眾勉吻,駕臨捧場(chǎng)谭梗,若有又不合理之處忘晤,還請(qǐng)斧正并予以包涵(第一次寫博客哈),在此小弟表示不勝感激<つ蟆(jg1712@dingtalk.com)OK德频,廢話不多說,各位觀眾請(qǐng)做好缩幸,小弟要開車了壹置,Oh no竞思,是開始表演了!
概覽
? ? ?啥钞护?WorkManager盖喷!謂之何物?WorkManager誕生Google难咕,屬于Jetpack 的一部分课梳。這玩意兒的誕生主要用用于后臺(tái)運(yùn)行的操作,例如庇嗟瑁活鴨暮刃,耗時(shí)請(qǐng)求鴨等等之類的。辣么有的老鐵可能要問了爆土,Android種四大組件種的service不是看可以干這個(gè)嗎椭懊,搞一個(gè)啥啥啥WorkManager,不似多次一舉嘛步势!哈哈哈Q踱!坏瘩!其實(shí)我也這么想過盅抚,but事出必有因嘛!咱先來瞅瞅?yàn)樯禛oogle推出了這個(gè)玩意兒倔矾,難道它比其他得架子長(zhǎng)得好看妄均?然則不是,真正原因是Google自O(shè)reo(API 26) 開始哪自,對(duì)后臺(tái)得service服務(wù)做了一些個(gè)限制丛晦,如在不被允許創(chuàng)建后臺(tái)服務(wù)得情況下,調(diào)用了startService()方法提陶,會(huì)導(dǎo)致IllegalStateException異常烫沙。因此如果要繼續(xù)使用service就必須通過Context類得靜態(tài)方法startForegroundService()來啟動(dòng)前臺(tái)服務(wù),系統(tǒng)也創(chuàng)建了服務(wù)隙笆,這就導(dǎo)致了應(yīng)用得在5秒鐘之內(nèi)調(diào)用該服務(wù)的 startForeground() 方法使其位于前臺(tái)被用戶發(fā)現(xiàn)锌蓄,要是超過了5那咱們的app可就拋ANR(Application Not Response),這就灰常的頭疼撑柔,咋辦嘞瘸爽?答曰---WorkManager!
使用入門
? ? 嗯GΨ蕖<艟觥!根據(jù)Google官網(wǎng)的介紹勒,咱要想使用WorkManager需要將以下依賴項(xiàng)添加到應(yīng)用的?build.gradle(老鐵注意了哈是Moudle工程下的) 文件中:
dependencies {?
? def work_version = "2.7.1"? ? // (Java only)? ?
? implementation "androidx.work:work-runtime:$work_version"? ? ? ? ?//Java的老鐵看這兒就夠了
? implementation "androidx.work:work-runtime-ktx:$work_version"? ?// ?此處是針對(duì)Kotlin+攜程的組合哈
}
? ? 當(dāng)咱們修改 ?build.gradle腳本文件后柑潦,記得需要Sync Now一下哈享言,當(dāng)依賴下載完成后就可以定義要執(zhí)行的工作啦(有的時(shí)候依賴可能下載不下來,建議可以用阿里云的鏡像會(huì)比較好些)渗鬼!
定義工作
? ? 定義工作任務(wù)那览露,就需要繼承WorkManager的?Worker抽象類,Worker類在運(yùn)行時(shí)由 WorkManager實(shí)例化譬胎,并在預(yù)先指定的后臺(tái)線程上調(diào)用 doWork() 方法差牛。該方法時(shí)同步的,因此一旦該方法被返回堰乔,Worker就被認(rèn)為已完成并將被銷毀偏化。如果需要異步工作則應(yīng)使用?ListenableWorker。如果工作因某種原因被占用镐侯,則不會(huì)使用相同的Worker實(shí)例侦讨。因此每個(gè)Worker實(shí)例只能調(diào)用一次doWork()方法,且一個(gè)Worker最多有10分鐘的時(shí)間來完成它的執(zhí)行并返回一個(gè)從?doWork()?返回一個(gè)?Result對(duì)象?析孽。這個(gè)對(duì)象有三個(gè)回調(diào)函數(shù):
Result.success():工作成功完成。
Result.failure():工作失敗只怎。
Result.retry():工作失敗袜瞬,應(yīng)根據(jù)其重試政策在其他時(shí)間嘗試。
下面就讓咱們?nèi)コ虺虼a該如何編寫吧身堡!
private class DownLoadWorker( context: Context, workerParameters: WorkerParameters) : Worker(context, workerParameters) {
? ? ? ?override fun doWork(): Result {
? ? ? ? ? //下載
? ? ? ? ?downLoad()
? ? ? ? ?//表明當(dāng)前worker已經(jīng)成功結(jié)束了
? ? ? ? return Result.success()
}
? ?private fun downLoad() {
? ? ? ?println("開始下載")
? ? ? }
}
似不似灰常簡(jiǎn)單邓尤,就繼承一個(gè)Worker抽象類。實(shí)現(xiàn)一下doWork()方法贴谎。有老鐵問了汞扎,咱創(chuàng)建了一個(gè)Worker子類咋用啊擅这?嗯澈魄,這個(gè)老鐵很不錯(cuò)!V亵帷痹扇!哈哈哈,欲知后事如何溯香,請(qǐng)往下看鲫构。
創(chuàng)建 WorkRequest
? ? ?WorkRequest?是用于指定應(yīng)在 WorkManager中排隊(duì)的工作的參數(shù)的基類(就是用來對(duì)Worker進(jìn)行一次包裝的)。通常情況下咱使用這玩意兒 玫坛,都是用它的兩個(gè)寶貝兒子结笨,OneTimeWorkRequest 和PeriodicWorkRequest.
OneTimeWorkRequest:針對(duì)非重復(fù)性工作,也就是一次性工作,用完就結(jié)束了炕吸,不會(huì)被重復(fù)使用伐憾。
PeriodicWorkRequest:可以被多次執(zhí)行,直到被取消算途,并且第一次執(zhí)行的時(shí)候會(huì)立刻發(fā)生塞耕,或者當(dāng)它滿足給定的約束時(shí)也會(huì)發(fā)生。---------二兒啊你把我上次交代的那個(gè)事兒再做一遍哈嘴瓤,在做一遍扫外。然后...........二兒啊,這都到點(diǎn)兒了廓脆,你咱還沒開始干活兒勒筛谚??停忿?二兒答曰:嗯驾讲。。席赂。你喊我二(撅嘴)吮铭。(哭笑)好家伙小脾氣上來了,于是乎我給它畫了N多張餅好話說盡颅停,奈何這小赤佬就是油鹽不進(jìn)(再次哭笑)谓晌。從此它開始不再勤快了,干起活兒來癞揉,拖拖拉拉纸肉,變得不再準(zhǔn)時(shí)(老鐵們注意哈),為啥不再準(zhǔn)時(shí)勒喊熟,究其原因是它會(huì)受到操作系統(tǒng)電池優(yōu)化的影響柏肪。
? ? 以上就是對(duì)咱兩個(gè)寶貝兒子的簡(jiǎn)要介紹,更多詳情還請(qǐng)移步Google官網(wǎng)哈芥牌。接下來我們就來看看咱調(diào)度這倆兒子為咱干活兒滴哈7澄丁!1诶(呲牙)
val workerRequest: WorkRequest =OneTimeWorkRequestBuilder<DownLoadWorker>()? ? ?// 此數(shù)我用的是一次性事件 拐叉,OneTimeWorkRequestBuilder是一個(gè)簡(jiǎn)單的內(nèi)聯(lián)函數(shù)封裝哈,它返回的是OneTimeWorkRequest.Builder對(duì)象
.build()
? ? 好嘛扇商。咱Worker也聲明了凤瘦,WorkRequest也創(chuàng)建了并包裝了咱的Worker。那接著就是需要把WorkRequest交給它的頂級(jí)老大操作系統(tǒng)去管理了啦
將 WorkRequest 提交給系統(tǒng)
? ? 將WorkRequest交給系統(tǒng)去管理需要借助WorkManager啦案铺,那么久讓咋們?nèi)タ纯创a如何實(shí)現(xiàn)吧蔬芥!
WorkManager.getInstance(applicationContext).enqueue(workerRequest)
? ?據(jù)官網(wǎng)介紹哈執(zhí)行工作器的確切時(shí)間與 WorkRequest?中使用的約束以及系統(tǒng)優(yōu)化方式有關(guān)。
參考地址:https://developer.android.google.cn/topic/libraries/architecture/workmanager/basics