最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用Kotlin API實(shí)踐WorkManager

 更新時(shí)間:2021年04月15日 09:16:51   作者:Android_開(kāi)發(fā)者  
這篇文章主要介紹了Android使用Kotlin API實(shí)踐WorkManager的步驟,幫助大家更好的理解和學(xué)習(xí)使用Android,感興趣的朋友可以了解下

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

WorkManager 基礎(chǔ)

當(dāng)您需要某個(gè)任務(wù)保持運(yùn)行狀態(tài),即使用戶切換到別的界面或者用戶將應(yīng)用切換到后臺(tái),甚至設(shè)備重啟的時(shí)候仍然不影響任務(wù)狀態(tài),那么非常推薦使用 WorkManager。類似的應(yīng)用場(chǎng)景包括:

  • 上傳日志或者報(bào)告數(shù)據(jù)
  • 使用濾鏡處理圖片的同時(shí)保存圖片
  • 通過(guò)網(wǎng)絡(luò)定期同步本地?cái)?shù)據(jù)

如果您的即時(shí)任務(wù)可以在用戶脫離某個(gè)作用域時(shí)結(jié)束,比如切換到其它界面,我們建議您還是直接使用 Kotlin 協(xié)程。

在這個(gè) WorkManager codelab 教程中,我們會(huì)對(duì)圖片進(jìn)行模糊化處理,并且將處理后的數(shù)據(jù)存儲(chǔ)在磁盤(pán)上。我們看一下這個(gè)過(guò)程中需要哪些操作。

添加 work-runtime-ktx 依賴:

// 獲取最新的版本號(hào)  https://developer.android.google.cn/jetpack/androidx/releases/work
def work_version = "2.5.0"
implementation "androidx.work:work-runtime-ktx:$work_version"

首先實(shí)現(xiàn)我們自己的 Worker 類。我們會(huì)在這里實(shí)現(xiàn)真正需要在后臺(tái)執(zhí)行業(yè)務(wù)的代碼。您可以擴(kuò)展 Worker 類,并且復(fù)寫(xiě) doWork() 方法。由于這個(gè)類非常重要,我們會(huì)在后邊內(nèi)容中進(jìn)行詳細(xì)介紹。這里是它最初的實(shí)現(xiàn)代碼。

/* 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()
        }
    }
…
}

接下來(lái),創(chuàng)建我們的 work 請(qǐng)求,在本例中,我們希望整個(gè)操作僅運(yùn)行一次,所以我們使用 OneTimeWorkRequest.Builder,將需要模糊化處理的圖片的 Uri 作為參數(shù)傳入。

Kotlin 小貼士 : 要?jiǎng)?chuàng)建輸入數(shù)據(jù),我們可以使用 workDataOf 函數(shù),它會(huì)幫我們創(chuàng)建數(shù)據(jù)構(gòu)建器,并且填充鍵值對(duì),然后為我們創(chuàng)建數(shù)據(jù)。

/* 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 類將上面所做的工作添加到計(jì)劃隊(duì)列并且運(yùn)行。我們可以提供需要執(zhí)行的任務(wù)和這些任務(wù)的限制條件。

/* Copyright 2020 Google LLC.  
   SPDX-License-Identifier: Apache-2.0 */

val workManager = WorkManager.getInstance(application)
val continuation = workManager.beginUniqueWork(blurBuilder.build())
// 執(zhí)行任務(wù)
continuation.enqueue()

使 Worker 開(kāi)始執(zhí)行任務(wù)

當(dāng)您使用 Worker 的時(shí)候,WorkManager 會(huì)在后臺(tái)線程中自動(dòng)調(diào)用 Worker.doWork()。doWork() 返回的 Result 會(huì)告知 WorkManager 服務(wù)是否成功,如果失敗則告知是否需要重試。

Worker.doWork() 屬于同步調(diào)用 -- 您的后臺(tái)操作需要以阻塞的方式執(zhí)行,并且所有任務(wù)需要在整個(gè) doWork() 函數(shù)結(jié)束的時(shí)候完成。如果您在 doWork() 里調(diào)用異步的 API 然后返回結(jié)果,那么您回調(diào)函數(shù)的執(zhí)行可能會(huì)出現(xiàn)問(wèn)題。

但是如果我希望進(jìn)行異步操作怎么辦?

我們來(lái)將上面的示例操作變得復(fù)雜一點(diǎn),比如我希望在數(shù)據(jù)庫(kù)中存儲(chǔ)所有進(jìn)行模糊化處理的文件的 Uri。

所以我創(chuàng)建了:

  • 一個(gè)簡(jiǎn)單的 BlurredImage 實(shí)體
  • 一個(gè)用于插入和獲取圖片的 DAO 類
  • 數(shù)據(jù)庫(kù)

相關(guān)的實(shí)現(xiàn)代碼請(qǐng) 點(diǎn)擊這里。

如果您需要執(zhí)行異步操作,比如在數(shù)據(jù)庫(kù)中存儲(chǔ)數(shù)據(jù)或者發(fā)起網(wǎng)絡(luò)請(qǐng)求,在 Kotlin 中,我們推薦使用 CoroutineWorker。

CoroutineWorker 通過(guò)使用 Kotlin 協(xié)程來(lái)執(zhí)行異步任務(wù)。

doWork() 方法是一個(gè) suspend 方法。也就是說(shuō)我們這里可以調(diào)用可掛起的 dao 函數(shù)。

/* 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 存儲(chǔ)到數(shù)據(jù)庫(kù)
           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() 默認(rèn)使用 Dispatchers.Default。您可以將其替換為您所需的 Dispatcher。在這里,我們不需要這么做,因?yàn)?Room 已經(jīng)將數(shù)據(jù)插入操作放在另外的 Dispatcher 中完成了。更多相關(guān)內(nèi)容可以參考 Room Kotlin API。

開(kāi)始使用 CoroutineWorker 來(lái)執(zhí)行異步任務(wù)吧,即使用戶關(guān)閉應(yīng)用也可以確保任務(wù)完成。

如果您希望了解更多關(guān)于 WorkManager 的內(nèi)容,請(qǐng)關(guān)注未來(lái)的相關(guān)文章。在那之前,可以訪問(wèn)我們的 codelab 和文檔:

以上就是Android使用Kotlin API實(shí)踐WorkManager的詳細(xì)內(nèi)容,更多關(guān)于Android實(shí)踐WorkManager的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

山阳县| 绥化市| 卫辉市| 徐水县| 屏南县| 鲁山县| 九龙城区| 原平市| 铜川市| 饶平县| 馆陶县| 保康县| 正宁县| 武乡县| 黄浦区| 睢宁县| 侯马市| 法库县| 视频| 清涧县| 平阴县| 邮箱| 曲水县| 宁安市| 阿拉善左旗| 衡山县| 蓬安县| 德兴市| 永安市| 伽师县| 西充县| 奈曼旗| 湄潭县| 汝阳县| 四子王旗| 甘孜县| 长宁区| 石泉县| 巴彦县| 峨眉山市| 秭归县|