Jetpack Architecture系列教程之(七)——WorkManager

目录

介绍

如何使用?

添加依赖

配置WorkManagerConfiguration

新建Worker

建立Worker约束

初始化Worker和常用的Work操作

Worker的进阶操作


介绍

        WorkManager是Jetpack组件库中提供的一种新的延迟异步方案,它可以实现应用程序退出或设备重新启动的可延迟(也可以不延迟)异步任务。例如:在程序退出时将日志上传到服务器等数据采集操作。

        官方建议,WorkManager不适用于在应用程序进程被kill后仍需执行的后台任务,也不适用于需要立即执行的任务。

如何使用?

添加依赖
dependencies {
     
    ...

    def work_version = '2.1.0'
    implementation "androidx.work:work-runtime:$work_version"
    implementation "androidx.work:work-runtime-ktx:$work_version"
}
配置WorkManagerConfiguration

 单例创建WorkManagerConfiguration,之后可以便于Worker配置。

internal class MyApplication : Application(), Configuration.Provider {
    override fun getWorkManagerConfiguration() =
        Configuration.Builder()
            .setMinimumLoggingLevel(Log.VERBOSE)
            .build()

    override fun onCreate() {
        super.onCreate()
    }

}
新建Worker

        新建一个下载Worker,执行Worker之后通过doWork()实现业务逻辑并回调任务Result,之后可以在onStopped()中监听到Worker结束。

class DownloadWork(var context: Context, private var workerParams: WorkerParameters) : Worker(context, workerParams) {


    override fun doWork(): Result {
        //worker execute...
         var result = false

         context.runOnUiThread {
             result = asyncDoWork()
         }

        return if(result){
            Result.success()
        }else{
            Result.failure()
        }

    }

    private fun asyncDoWork(): Boolean {
        ...
    }


    override fun onStopped() {
        super.onStopped()
        //worker task stop ...
    }

}
建立Worker约束

针对使用场景建立worker调用约束

    val myConstraints = Constraints.Builder()
// .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
// .setRequiresCharging(true)//指定要运行的{@link WorkRequest}是否应该插入设备
// .setRequiredNetworkType(NetworkType.NOT_ROAMING)
// .setRequiresBatteryNotLow(true)//指定设备电池是否不应低于临界阈值
// .setRequiresCharging(true)//网络状态
// .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲
// .setRequiresStorageNotLow(true)//指定设备可用存储是否不应低于临界阈值
// .addContentUriTrigger(Uri.parse(uri),false)//指定内容{@link android.net.Uri}时是否应该运行{@link WorkRequest}更新
    .build()
初始化Worker和常用的Work操作

        运行单次Work。enqueue()是执行work操作,cancelWorkById()可以通过所绑定的OneTimeWorkRequestBuilder.id取消相应的work(已执行的)操作。

val requestOneTimeWork = OneTimeWorkRequestBuilder<DownloadWork>()
        .setInputData(data)
        .setConstraints(myConstraints)
        .build()

    // added enqueue one time work
    WorkManager.getInstance(this@MainActivity).enqueue(requestOneTimeWork)
    // cancel work from id
// WorkManager.getInstance(this@MainActivity).cancelWorkById(requestOneTimeWork.id)

运行定期Work,每60秒运行一次。

val requestPeriodicWork = PeriodicWorkRequestBuilder<DownloadWork>(60, TimeUnit.SECONDS)
       .setInputData(data)
       .setConstraints(myConstraints)
       .build()

WorkManager.getInstance(this@MainActivity).enqueue(requestPeriodicWork)

查看Work运行结果。

val liveData: LiveData<WorkInfo> = WorkManager.getInstance(this@MainActivity).getWorkInfoByIdLiveData(requestOneTimeWork.id)
        liveData.observe(this, Observer {
            if (it?.state!!.isFinished) {
                if(liveData.value?.state == WorkInfo.State.SUCCEEDED){
                    //success
                    println("download success")
                }else{
                    //other
                    println("download error")
                }
            }
})

Worker的进阶操作

链式任务:依次有序的执行workA、workB、workC

WorkManager.getInstance()
    .beginWith(workA)
    .then(workB)   
    .then(workC)
    .enqueue()

并行任务:workA、workB、workC同时执行

WorkManager.getInstance()
    .beginWith(workA, workB, workC)  
    .enqueue()

        多链式任务:让workA、workB和workC、workD两组work集并行,两组work集并行运行结束后再执行workE

val configA_B = WorkManager.getInstance()
     .beginWith(workA)
     .then(workB)
 
val configC_D = WorkManager.getInstance()
     .beginWith(workC)
     .then(workD)
 
WorkContinuation.combine(configA_B,configC_D)
     .then(workE)
     .enqueue()

标记任务:让有标记工作序列的work执行,被标记的work不能多次放入任务链执行

WorkManager.getInstance().beginUniqueWork("work tag", ExistingWorkPolicy.APPEND, workRequest)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中DataX使用第四期

简介 紧接着上期关于定义如何一个简单的插件&#xff0c;本期了解下关系型数据库的数据读取和数据写入。 环境 Windows10 (linux中命令相似&#xff0c;为了方面调试就用windows的)JDK(1.8以上&#xff0c;推荐1.8)Python(2或3都可以)Apache Maven (推荐3.x版本)IntelliJ IDEA…

Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业&#xff0c;传统订货模式弊端日益凸显&#xff0c;严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案&#xff0c;为连锁门店订货带来了全方位的变革&#xff0c;助力企业实现数字化转型升级&#xff0c;在市场中抢占先机。 一、增强总部…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;赵晗&#xff0c;浙江大学-西湖大学联合培养博士生 内容简介 近年来&#xff0c;在各个领域应用多模态大语言模型&#xff08;MLLMs&…

java中的Entry类,map接口

看Redisson源码时候发现有个Entry&#xff0c;眼熟&#xff0c;遂查资料 Map.Enty<KV> 是在Map接口中的一个内部接口Entry 作用&#xff1a;当Map集合一创建那么就会在Map集合中创建一个Enty对象&#xff0c;用来记录键与值&#xff08;键值对对象&#xff0c;键与值的…

HarmonyOS学习第4天: DevEco Studio初体验

初次邂逅&#xff1a;DevEco Studio 在数字化浪潮汹涌澎湃的当下&#xff0c;移动应用开发领域始终是创新与变革的前沿阵地。鸿蒙系统的横空出世&#xff0c;宛如一颗璀璨新星&#xff0c;照亮了这片充满无限可能的天空&#xff0c;为开发者们开启了一扇通往全新世界的大门。而…

ue5地面上出现preview字样

如图&#xff1a; 解决办法 将光源修改为moveable 参考博客&#xff08;UE光影有preview字样、输出也有_ue5阴影preview消除-CSDN博客

Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)

文章目录 功能包括如何使用 功能包括 红点数据本地持久化 如果子节点有红点&#xff0c;父节点也要显示红点&#xff0c;父节点红点数为子节点红点数的和&#xff1b; 当子节点红点更新时&#xff0c;对应的父节点也要更新&#xff1b; 当所有子节点都没有红点时&#xff0c…

个人环境配置--安装记录

根据显卡下载对应的cuda和cudnn 我使用的是docker,首先拉取镜像,我用的是ubuntu20.04 加速&#xff1a;pull hub.1panel.dev/ devel是开发版本 sudo docker pull hub.1panel.dev/nvidia/cuda:11.6.1-devel-ubuntu20.04先测试一下cuda有没有安装好 nvcc -V更新&#xff0c;安装…

代码审计初探

学会了基础的代码审计后&#xff0c;就该提高一下了&#xff0c;学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计&#xff0c;把相关文件放到phps…

记录Qt 虚拟键盘样式修改与使用

文章目录 概述 一、使用虚拟键盘 二、项目文件定义 1.VirtualKeyboard.qml 2.main.qml 3.main.cpp 三、编译运行 1.编译 2.运行 3.运行效果 总结 概述 在 Qt 开发中&#xff0c;虚拟键盘是移动设备和嵌入式设备中常用的输入工具。本文将详细介绍如何通过 QML 修改虚拟键盘样式…

国产开源PDF解析工具MinerU

前言 PDF的数据解析是一件较困难的事情&#xff0c;几乎所有商家都把PDF转WORD功能做成付费产品。 PDF是基于PostScript子集渲染的&#xff0c;PostScript是一门图灵完备的语言。而WORD需要的渲染&#xff0c;本质上是PDF能力的子集。大模型领域&#xff0c;我们的目标文件格…

基于单片机的智能电表设计(论文+源码)

2.1 系统整体方案设计 本课题为基于单片机的电子式单项智能电表&#xff0c;在此设计如图2.1所示的系统总体架构&#xff0c;其采用STM32单片机作为主控制器&#xff0c;搭配外设HLW8032模块实现对电压&#xff0c;电流&#xff0c;功率因数&#xff0c;电能消耗等参数进行检…

Kafka在Windows系统使用delete命令删除Topic时出现的问题

在使用Windows的Kafka时&#xff0c;想要删除某一个主题&#xff0c;发现使用了delete之后会一直报警告。下面是我发现错误之后重新实测的Bug 先创建2个topic kafka-topics.bat --bootstrap-server localhost:9092 --topic test1 --createkafka-topics.bat --bootstrap-serve…

【部署优化篇十三】深度解析《DeepSeek API网关:Kong+Nginx配置指南》——从原理到实战的超详细手册

一、为什么需要API网关?从单体服务到微服务的必然选择 1.1 单体服务的痛点 想象一下早期的淘宝——所有功能(用户中心、商品管理、订单系统)都打包在一个巨型服务里。这样的架构存在三大致命问题: 单点故障:一旦服务崩溃,整个系统瘫痪扩展困难:每次发布都需要全量部署…

在一个集成的 SynMatrix-Ansys 设计工作流程中实现 3D 滤波器仿真

Synmatrix Technologies Inc.是Ansys 的技术合作伙伴&#xff0c;通过一体化 RF 滤波器设计和测试调整软件平台提供解决方案&#xff0c;该平台可与 Ansys HFSS 3D 高频电磁 (EM) 仿真软件配对&#xff0c;以减少开发时间、材料和运营成本、设计风险和产品故障。 典型的射频/微…

仿uni-segmented-control添加左右滑动效果

官网的选项卡没有左右滑动的效果&#xff0c;本身的样式也不太好看&#xff0c;所以封装了个简易的组件达到相同的效果&#xff0c;可自行修改css部分修改样式~ 封装组件效果如下 custom-segmented-control.vue <template><view class"container"><v…

LeetCode51

LeetCode51 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 N 皇后问题&#xff1a;将 n 个皇后放置在 n x n 的棋盘上&#xff0c;使得皇后彼此之间不能相互攻击&#xff08;即任何两个皇后不能在同一行、同一列或同一斜线上&#x…

Lineageos 22.1(Android 15)Launcer简单调整初始化配置

一、前言 Launcer的初始化配置主要在如下的xml文件夹下&#xff0c;默认读取的5x5 这里我们把device_profiles调整一下&#xff0c;然后新建一个default_workspace_my.xml作为我们自己的配置就行。 二、配置 注意Lineageos 的Launcer是在lineageos/packages/apps/Trebuchet…

2025.2.23机器学习笔记:PINN文献阅读

2025.2.23周报 一、文献阅读题目信息摘要Abstract创新点网络架构架构A架构B架构C 实验结论后续展望 一、文献阅读 题目信息 题目&#xff1a; Physics-Informed Neural Networks for Modeling Water Flows in a River Channel期刊&#xff1a; IEEE TRANSACTIONS ON ARTIFICI…