IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Jetpack WorkManager 的使用 -> 正文阅读

[移动开发]Android Jetpack WorkManager 的使用

官网链接 使用 WorkManager 调度任务 | Android 开发者 | Android Developers
https://developer.android.google.cn/topic/libraries/architecture/workmanager

WorkManager 是一个 API,可供您轻松调度那些即使在退出应用或重启设备后仍应运行的可靠异步任务。

WorkManager 适用于需要可靠运行的工作,即使用户导航离开屏幕、退出应用或重启设备也不影响工作的执行。例如:

  • 向后端服务发送日志或分析数据
  • 定期将应用数据与服务器同步

简言之,WorkManager 用于执行后台任务。

优势:

  • 使用工作约束明确定义工作运行的最佳条件。工作约束有电量充足、联网约束(如仅Wifi情况)、设备空闲等。
  • 调度灵活。可以执行一次或周期性任务,可对任务添加标记,可取消任务。
  • 灵活的重试策略。任务执行失败的话可选择重试。
  • 工作链。对于多个任务,可以约定任务的先后执行关系。

开始使用,

1.添加依赖

dependencies {
    def work_version = "2.5.0"
    
    // WorkManager
    implementation "androidx.work:work-runtime:$work_version"
}

2.自定义Worker

自定义一个任务,继承 Worker ,重写 doWork() 方法,doWork() 方法中实现具体的后台任务逻辑。

import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters

class MyWorker(context: Context, parameters: WorkerParameters) : Worker(context, parameters) {

    override fun doWork(): Result {
        //TODO("Not yet implemented")
        // do really work
        return Result.success()
    }
}

doWork() 返回的 Result 结果有:

  • Result.success():工作成功完成。
  • Result.failure():工作失败。
  • Result.retry():工作失败,可根据配置的重试策略在其他时段重试。

3.创建请求 WorkRequest

使用 OneTimeWorkRequest 创建单次运行的后台任务请求,

var request = OneTimeWorkRequest.Builder(MyWorker::class.java).build()

可以添加 标签和 其他约束条件,

var request = OneTimeWorkRequest
    .Builder(MyWorker::class.java)
    //10分钟后执行
    .setInitialDelay(10, TimeUnit.MINUTES)
    // 标签设为 tag_request ,可根据标签取消任务
    .addTag("tag_request")
    // 结合 Result.retry() 使用,任务失败重新执行任务,
    //任务实行失败的话, 60 秒后重试,再次失败的话,下次重试的时间间隔线性增加(也可以设置成指数性(BackoffPolicy.EXPONENTIAL)增加)
    .setBackoffCriteria(BackoffPolicy.LINEAR, 60, TimeUnit.SECONDS)
    .build()

如果设置了 setBackoffCriteria ,可以根据任务的 id 来监听任务执行结果,

WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.id)
            .observe(this){ workInfo ->
                if (workInfo.state == WorkInfo.State.SUCCEEDED) {

                } else if (workInfo.state == WorkInfo.State.FAILED) {

                }
            }

4.将 WorkRequest 提交给系统

很简单,这样就提交给系统了,系统会在合适的时机执行。

WorkManager.getInstance(this).enqueue(request)

5.工作链

有多个任务的话,可以约束他们的先后执行关系,

val request1 = OneTimeWorkRequest.Builder(MyWorker::class.java).addTag("request1").build()
val request2 = OneTimeWorkRequest.Builder(MyWorker::class.java).addTag("request2").build()
val request3 = OneTimeWorkRequest.Builder(MyWorker::class.java).addTag("request3").build()

WorkManager.getInstance(this)
                .beginWith(request1)
                .then(request2)
                .then(request3)
                .enqueue()

先执行 request1 ,再执行 request2 ,然后执行 request3 。如果 request1 执行失败,request2 和 request3 就不会执行。

6.取消任务

根据 id 取消单个任务

WorkManager.getInstance(this).cancelWorkById(request.id)

根据 tag 取消此 tag 下的所有任务

WorkManager.getInstance(this).cancelAllWorkByTag("tag_request")

取消所有任务

WorkManager.getInstance(this).cancelAllWork()
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:27:20  更:2021-08-08 11:27:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:55:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码