日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android使用Kotlin API實踐WorkManager

瀏覽:13日期:2022-09-19 13:37:21

WorkManager 提供了一系列 API 可以更加便捷地規劃異步任務,即使在應用被關閉之后或者設備重啟之后,仍然需要保證立即執行的或者推遲執行的任務被正常處理。對于 Kotlin 開發者,WorkManager 為協程提供了最佳的支持。在本文中,我將通過實踐 WorkManager codelab 為大家展示 WorkManager 中與協程相關的基本操作。那么讓我們開始吧!

WorkManager 基礎

當您需要某個任務保持運行狀態,即使用戶切換到別的界面或者用戶將應用切換到后臺,甚至設備重啟的時候仍然不影響任務狀態,那么非常推薦使用 WorkManager。類似的應用場景包括:

上傳日志或者報告數據 使用濾鏡處理圖片的同時保存圖片 通過網絡定期同步本地數據

如果您的即時任務可以在用戶脫離某個作用域時結束,比如切換到其它界面,我們建議您還是直接使用 Kotlin 協程。

在這個 WorkManager codelab 教程中,我們會對圖片進行模糊化處理,并且將處理后的數據存儲在磁盤上。我們看一下這個過程中需要哪些操作。

添加 work-runtime-ktx 依賴:

// 獲取最新的版本號 https://developer.android.google.cn/jetpack/androidx/releases/workdef work_version = '2.5.0'implementation 'androidx.work:work-runtime-ktx:$work_version'

首先實現我們自己的 Worker 類。我們會在這里實現真正需要在后臺執行業務的代碼。您可以擴展 Worker 類,并且復寫 doWork() 方法。由于這個類非常重要,我們會在后邊內容中進行詳細介紹。這里是它最初的實現代碼。

/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */class BlurWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) { override fun doWork(): Result {val resourceUri = inputData.getString(KEY_IMAGE_URI)return try { if (resourceUri.isNullOrEmpty()) {Timber.e('Invalid input uri')throw IllegalArgumentException('Invalid input uri') } val outputData = blurAndWriteImageToFile(resourceUri) Result.success(outputData)} catch (throwable: Throwable) { Timber.e(throwable, 'Error applying blur') Result.failure()} }…}

接下來,創建我們的 work 請求,在本例中,我們希望整個操作僅運行一次,所以我們使用 OneTimeWorkRequest.Builder,將需要模糊化處理的圖片的 Uri 作為參數傳入。

Kotlin 小貼士 : 要創建輸入數據,我們可以使用 workDataOf 函數,它會幫我們創建數據構建器,并且填充鍵值對,然后為我們創建數據。

/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */val blurBuilder = OneTimeWorkRequestBuilder<BlurWorker>()val data = workDataOf(KEY_IMAGE_URI to imageUri.toString())blurBuilder.setInputData(data)

我們使用 WorkManager 類將上面所做的工作添加到計劃隊列并且運行。我們可以提供需要執行的任務和這些任務的限制條件。

/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */val workManager = WorkManager.getInstance(application)val continuation = workManager.beginUniqueWork(blurBuilder.build())// 執行任務continuation.enqueue()使 Worker 開始執行任務

當您使用 Worker 的時候,WorkManager 會在后臺線程中自動調用 Worker.doWork()。doWork() 返回的 Result 會告知 WorkManager 服務是否成功,如果失敗則告知是否需要重試。

Worker.doWork() 屬于同步調用 -- 您的后臺操作需要以阻塞的方式執行,并且所有任務需要在整個 doWork() 函數結束的時候完成。如果您在 doWork() 里調用異步的 API 然后返回結果,那么您回調函數的執行可能會出現問題。

但是如果我希望進行異步操作怎么辦?

我們來將上面的示例操作變得復雜一點,比如我希望在數據庫中存儲所有進行模糊化處理的文件的 Uri。

所以我創建了:

一個簡單的 BlurredImage 實體 一個用于插入和獲取圖片的 DAO 類 數據庫

相關的實現代碼請 點擊這里。

如果您需要執行異步操作,比如在數據庫中存儲數據或者發起網絡請求,在 Kotlin 中,我們推薦使用 CoroutineWorker。

CoroutineWorker 通過使用 Kotlin 協程來執行異步任務。

doWork() 方法是一個 suspend 方法。也就是說我們這里可以調用可掛起的 dao 函數。

/* Copyright 2020 Google LLC. SPDX-License-Identifier: Apache-2.0 */class BlurWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) { override suspend fun doWork(): Result {val resourceUri = inputData.getString(KEY_IMAGE_URI)return try { if (resourceUri.isNullOrEmpty()) {Timber.e('Invalid input uri')throw IllegalArgumentException('Invalid input uri') } val outputData = blurAndWriteImageToFile(resourceUri) // 將 uri 存儲到數據庫 val imageDao = ImagesDatabase.getDatabase(applicationContext).blurredImageDao() imageDao.insert(BlurredImage(resourceUri)) Result.success(outputData)} catch (throwable: Throwable) { Timber.e(throwable, 'Error applying blur') Result.failure()} }...}

doWork() 默認使用 Dispatchers.Default。您可以將其替換為您所需的 Dispatcher。在這里,我們不需要這么做,因為 Room 已經將數據插入操作放在另外的 Dispatcher 中完成了。更多相關內容可以參考 Room Kotlin API。

開始使用 CoroutineWorker 來執行異步任務吧,即使用戶關閉應用也可以確保任務完成。

如果您希望了解更多關于 WorkManager 的內容,請關注未來的相關文章。在那之前,可以訪問我們的 codelab 和文檔:

WorkManager 文檔 Codelab | 使用 WorkManager Codelab | WorkManager 進階

以上就是Android使用Kotlin API實踐WorkManager的詳細內容,更多關于Android實踐WorkManager的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀va亚洲va欧美va天堂| 99国产精品99久久久久久粉嫩| 久久蜜桃精品| sm久久捆绑调教精品一区| 国产在线日韩精品| 精品国产精品久久一区免费式| 精品视频一区二区三区四区五区 | 欧美日韩国产在线观看网站| 女生影院久久| 中文字幕在线高清| 日韩成人精品一区| 91精品啪在线观看国产18| xxxxx性欧美特大| 色婷婷久久久| 亚洲婷婷在线| 在线一区欧美| 亚洲精品伊人| 91成人在线| 久久精品国产久精国产爱| 国产精品毛片久久| 亚洲福利一区| 91精品一区国产高清在线gif| 久久亚洲国产| 国产精品人人爽人人做我的可爱| 视频国产精品| 麻豆精品av| 日韩高清中文字幕一区二区| 九九久久婷婷| 日日夜夜免费精品视频| 久久国产欧美日韩精品| 国产一区二区三区亚洲| 精品亚洲美女网站| 亚洲福利精品| 另类国产ts人妖高潮视频| 天堂av一区| 精品免费av一区二区三区| 久久久精品日韩| 中文字幕免费精品| 欧美a级一区二区| 久久激情婷婷| 日本一区中文字幕| 国产不卡一区| 午夜电影亚洲| 日韩av在线免费观看不卡| 久久精品五月| 午夜宅男久久久| 7777精品| 欧美sm一区| 蜜臀精品一区二区三区在线观看 | 亚洲国产专区校园欧美| 中文在线一区| 国产精品成人3p一区二区三区| 丁香婷婷久久| 久久国产小视频| 欧美视频久久| 99精品综合| 亚洲精品四区| 欧美13videosex性极品| 亚洲精品无播放器在线播放| 色偷偷色偷偷色偷偷在线视频| 中文字幕乱码亚洲无线精品一区| 国产h片在线观看| 日韩激情av在线| 国产成人77亚洲精品www| 蜜臀av性久久久久蜜臀aⅴ流畅| 激情久久99| 日本精品国产| 99在线精品免费视频九九视| 国内精品美女在线观看| 亚洲资源在线| 亚洲调教视频在线观看| 免费在线成人| 丝袜国产日韩另类美女| 91欧美日韩| 日韩精品亚洲aⅴ在线影院| 日韩福利一区| 国产精品久一| 日韩精品一二三区| 日本精品黄色| 日韩综合一区二区三区| 日韩一区二区三区在线免费观看| 欧美亚洲tv| 欧美日韩一二| 国产精品网址| 蜜桃av一区二区| 日韩在线短视频| 欧美日本不卡| 蜜桃av一区| 亚洲精品88| 国产精品极品在线观看| 日韩精品a在线观看91| 久久亚洲美女| 日韩午夜一区| 国产成人精品三级高清久久91 | 国产精品一卡| 丝袜国产日韩另类美女| 日韩精品中文字幕第1页| 老色鬼精品视频在线观看播放| 天堂久久一区| 五月婷婷六月综合| 电影亚洲精品噜噜在线观看| 欧美一区在线观看视频| 在线国产一区| 欧美+日本+国产+在线a∨观看| 精品一区二区三区中文字幕 | 午夜在线视频观看日韩17c| 欧美精品高清| 中文字幕在线官网| 成人黄色av| 91亚洲自偷观看高清| 精品九九久久| 开心激情综合| 久久精品国产网站| 卡一精品卡二卡三网站乱码| 国产精品超碰| 毛片不卡一区二区| 免费在线亚洲| 国产精品黄网站| 国产精品网站在线看| 国产福利一区二区精品秒拍| 久久超碰99| 久久香蕉网站| 精品一区二区三区视频在线播放| 国产精品毛片久久久| 日韩二区三区在线观看| 日韩国产精品久久久久久亚洲| 欧美在线观看天堂一区二区三区| 日本不卡一区二区三区| 国产欧美三级| 美女视频免费精品| 国产aⅴ精品一区二区四区| 国产a亚洲精品| 国产精选在线| 久久久久国产| 狠狠爱成人网| 美国三级日本三级久久99| 蜜臀久久99精品久久久画质超高清| 亚洲精品福利| 久久国产视频网| 国产成人在线中文字幕| 亚洲va中文在线播放免费| 亚洲先锋成人| 蜜桃视频一区二区三区 | 日韩欧美三区| 日韩国产在线一| 鲁大师精品99久久久| 久久久久伊人| 久久一区二区三区喷水| 丝袜脚交一区二区| 97se亚洲| 成午夜精品一区二区三区软件| 免费污视频在线一区| 亚洲精品一区二区在线看| 国产麻豆综合| 国产精品一级| 日本精品不卡| 久久亚洲图片| 麻豆高清免费国产一区| 99精品综合| 日韩精品一区二区三区中文在线| 精品一区二区三区视频在线播放 | 日韩精品1区| 日韩中文字幕av电影| 欧美一级久久| 捆绑调教日本一区二区三区| 激情欧美亚洲| 日韩精品a在线观看91| 国产成人精品999在线观看| 亚洲精华国产欧美| 国产精品久久久久久久久久白浆 | 亚洲欧美日韩精品一区二区| 六月丁香综合| 日韩av在线播放中文字幕| 精品久久久久中文字幕小说| 亚洲五月婷婷| 国产一卡不卡| 久久国产日韩| 日韩动漫一区| 丝袜美腿诱惑一区二区三区| 日韩视频二区| 欧美精品影院| 久久精品国内一区二区三区水蜜桃| 亚洲一级大片| 日韩精品诱惑一区?区三区| 久久国产88| 黄色aa久久| 青草av.久久免费一区| 久久麻豆精品| 国产精品1区| 亚洲欧美日本视频在线观看| 久久精品伊人| 蜜桃久久av| 精品国产91| 四虎精品一区二区免费| sm捆绑调教国产免费网站在线观看| 性一交一乱一区二区洋洋av| 国内揄拍国内精品久久| 日本在线视频一区二区| 在线成人动漫av| 久久精品人人|