WorkManager

WorkManager作用
  • 后臺(tái)執(zhí)行任務(wù)的需求是十分常見的,Android也提供了多種解決方案,如JobScheduler,Loader,Server等,如果這些API沒有被恰當(dāng)使用,則可能會(huì)消耗大量電量。Android在解決應(yīng)用程序耗電問題上各種嘗試,從Doze到APP Standby,通過各種方式限制和管理應(yīng)用程序,以保證應(yīng)用不會(huì)再后臺(tái)消耗過多的設(shè)備電量。Workmanager為應(yīng)用程序中那些不需要及時(shí)完成的任務(wù)提供了一個(gè)統(tǒng)一的解決方案,以便在設(shè)備電量和用戶體驗(yàn)之間達(dá)到一個(gè)比較好的平衡。
WorkManager的兼容方案
  • WorkManager能根據(jù)設(shè)備的情況,選擇不同的執(zhí)行方案。在API Level 23以上設(shè)備中,通過JobScheduler完成任務(wù),在API Level 23以下的設(shè)備中,通過ALarmManager和Broadcast Receivers組合來完成任務(wù)。但無論采用哪種方案,任務(wù)最重由Executor來執(zhí)行
  • 另外,WorkManager不是一種新的工作線程,它的出現(xiàn)不是為了替代其他類型的工作線程,工作線程通常立即運(yùn)行,并在任務(wù)執(zhí)行完成后給用戶反饋。而WorkManager不是即時(shí)的,它不能保證任務(wù)立即執(zhí)行
WorkManager的使用方法
  1. 添加依賴
  2. 使用Work類定義任務(wù)
  3. 使用WorkRequest配置任務(wù)
  • 設(shè)置任務(wù)觸發(fā)條件
  • 將任務(wù)觸發(fā)條件設(shè)置到WorkRequest
  • 設(shè)置延遲執(zhí)行任務(wù)
  • 設(shè)置指數(shù)退避策略
  • 為任務(wù)設(shè)置Tag標(biāo)簽
WorkManager的使用方法
  1. 將任務(wù)交給系統(tǒng)
  2. 觀察任務(wù)的狀態(tài)
  3. 取消任務(wù)
  4. 參數(shù)傳遞
  5. 周期性任務(wù)
  6. 任務(wù)鏈
class MyWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    override fun doWork(): Result {
        val inputData = inputData.getString("data")
        SystemClock.sleep(2000)
        Log.e("lyb=======", "MyWorker doWork $inputData")
        //任務(wù)執(zhí)行完返回?cái)?shù)據(jù)
        val putString = Data.Builder().putString("outputData", "執(zhí)行成功").build()
        return Result.success(putString)
    }
}
fun mAddWork(view : View){
        // 設(shè)置觸發(fā)條件
        val constraints = Constraints.Builder()
            // NetworkType.NOT_REQUIRED 對(duì)網(wǎng)絡(luò)沒有要求
            // NetworkType.CONNECTED 網(wǎng)絡(luò)連接的時(shí)候執(zhí)行
            // NetworkType.UNMETERED 不計(jì)費(fèi)的網(wǎng)絡(luò)比如WIFI下執(zhí)行
            //NetworkType.NOT_ROAMING 非漫游網(wǎng)絡(luò)狀態(tài)
            //NetworkType.METERED 計(jì)費(fèi)網(wǎng)絡(luò)比如 3G 4G 不執(zhí)行
//            .setRequiresBatteryNotLow(true) //不在電量不足執(zhí)行
//            .setRequiresCharging(true) // 在充電時(shí)執(zhí)行
//            .setRequiresStorageNotLow(true) //不在存儲(chǔ)容量不足時(shí)執(zhí)行
//            .setRequiresDeviceIdle(true) //在待機(jī)狀態(tài)下執(zhí)行 調(diào)用需要API級(jí)別最低為23
            .setRequiredNetworkType(NetworkType.NOT_REQUIRED)
            .build()

        val inputData = Data.Builder()
            .putString("data","workRequest")
            .build()

        val workRequest = OneTimeWorkRequest.Builder(MyWorker::class.java)
            .setConstraints(constraints)
            //設(shè)置延遲執(zhí)行
            .setInitialDelay(5,TimeUnit.SECONDS)
            //指數(shù)退避策略
//            .setBackoffCriteria(BackoffPolicy.LINEAR, Duration.ofSeconds(2L))
            //設(shè)置Tag標(biāo)簽
            .addTag("workRequest")
                //傳遞參數(shù)
            .setInputData(inputData)
            .build()

        //周期性任務(wù)
//        val workRequest1 = PeriodicWorkRequest.
 // Builder(MyWorker::class.java, Duration.ofMillis(15)).build()

//任務(wù)鏈
//val workA = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workB = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//WorkManager.getInstance(this)
//    .beginWith(workA)
//    .then(workB)
//    .enqueue()

//任務(wù)鏈組合
//val workA = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workB = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workC = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workD = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val workE = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
//val continuation1 = WorkManager.getInstance(this)
//    .beginWith(workA).then(workB)
//val continuation2 = WorkManager.getInstance(this)
//    .beginWith(workC).then(workD)
//WorkContinuation.combine(listOf(continuation1,continuation2)).then(workE).enqueue()

        val workManager = WorkManager.getInstance(this)
        workManager.enqueue(workRequest)

        // 監(jiān)聽任務(wù)狀態(tài)
        workManager.getWorkInfoByIdLiveData(workRequest.id).observe(this){
            Log.e("lyb=====",it.toString())
            if(it.state == WorkInfo.State.SUCCEEDED){
                val output = it.outputData.getString("outputData")
            }
        }

        //取消任務(wù)
//        workManager.cancelWorkById(workRequest.id)

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • WorkManager[https://developer.android.google.cn/topic/lib...
    谷歌開發(fā)者閱讀 3,645評(píng)論 1 18
  • 目錄google后臺(tái)任務(wù)推薦方案doze簡(jiǎn)介從jobservice 到android-job 到workmanag...
    Dynamic_2018閱讀 18,341評(píng)論 7 18
  • 本篇文章完全轉(zhuǎn)載于微笑的江豚 的博客地址: https://my.oschina.net/JiangTun如有問...
    PeterHe888閱讀 2,035評(píng)論 0 2
  • 前言 前面的內(nèi)容中我們已經(jīng)介紹了很多Jetpack中的架構(gòu)組件,可以說每一種組件的出現(xiàn)都是為了更好的解決現(xiàn)在存在的...
    rivenlee閱讀 896評(píng)論 0 1
  • 1、概述 在 I / O '18中,Google發(fā)布了Android Jetpack。它是一組庫,工具和架構(gòu)指南,...
    高丕基閱讀 7,673評(píng)論 1 12

友情鏈接更多精彩內(nèi)容