电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Android使用Kotlin API實踐WorkManager

瀏覽:19日期: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
相關文章:
主站蜘蛛池模板: 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 高铝砖-高铝耐火球-高铝耐火砖生产厂家-价格【荣盛耐材】 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 菏泽知彼网络科技有限公司 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | ZHZ8耐压测试仪-上海胜绪电气有限公司| 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 领袖户外_深度旅游、摄影旅游、小团慢旅行、驴友网 | 湖南成人高考报名-湖南成考网| 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 工业rfid读写器_RFID工业读写器_工业rfid设备厂商-ANDEAWELL | 地源热泵一体机,地源热泵厂家-淄博汇能环保设备有限公司 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 壹车网 | 第一时间提供新车_资讯_报价_图片_排行! | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 防锈油-助焊剂-光学玻璃清洗剂-贝塔防锈油生产厂家 | 托利多电子平台秤-高精度接线盒-托利多高精度电子秤|百科 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 517瓜水果特产网|一个专注特产好物的网站 |