WorkManager从入门到实践,有这一篇就够了

f70905b221df0f39a6bdc391c4311f54.gif

作者 | Eason

来源 | 程序员巴士

前言

一般情况下,我们大部分的操作都是在app打开的时候进行的,但是在某些情况下,即使app关闭了,我们也可能需要执行必要的动作,或者会采取一个动作,而不是让用户等待加载,我们可以在后台执行此操作并通知用户结果。针对这些日常工作中经常出现但是又非常棘手的情况,学会使用workManager将会大家轻松解决这些问题。

WorkManager 是一个 API,可供大家轻松调度那些即使在退出应用或重启设备后仍应运行的可靠异步任务。WorkManager API 是一个适合用来替换所有先前的 Android 后台调度 API(包括 FirebaseJobDispatcher、GcmNetworkManager 和 JobScheduler等)的组件,本人也建议您这样做。WorkManager 在其现代、一致的 API 中整合了其前身的功能,该 API 支持 14及以上,在开发时考虑到了对电池续航等影响。

何时使用 WorkManager

WorkManager 处理需要在满足各种约束时运行的后台工作,而不管应用程序进程是否处于活动状态。后台工作可以在应用程序在后台、应用程序在前台或应用程序在前台启动但转到后台时启动。无论应用程序在做什么,后台工作都应该继续执行,或者如果 Android 终止其进程则重新启动。

关于 WorkManager 的一个常见混淆是它用于需要在“后台”线程中运行但不需要在进程死亡后继续存在的任务。不是这种情况。对于此用例,还有其他解决方案,例如 Kotlin 的协程、线程池或 RxJava 等库。

针对许多不同的情况都需要运行后台工作,因此运行后台工作有不同的解决方案。

bf48a6481738ebae79fbbd446682f1c3.png

使用的充分不必要条件?

在 WorkManager 的情况下,最好用于必须完成且可延迟的后台工作。

首先,问问自己:

  • 这个任务需要完成吗?

如果应用被用户关闭,是否还需要完成任务?一个例子是带有远程同步的笔记应用程序;写完笔记后,如果希望该应用程序将笔记与后端服务器同步。即使切换到另一个应用程序并且操作系统需要关闭该应用程序以回收一些内存,也会发生这种情况。就算重新启动设备,它也应该发生。可以通过WorkManager 来确保任务完成。

  • 这个任务可以延期吗?

我们可以在以后运行的任务,或者只运行是有用的权利呢?如果任务可以稍后运行,那么它是可延迟的。看下前面的示例,立即上传即时笔记很理想,但是由于网络限制等原因,不可能和编辑同步进行,不过这也不是什么大问题,毕竟主流应用的用户习惯都是这样。而正因为WorkManager 尊重操作系统背景限制,并尝试以省电的方式运行您的工作, 因此这也是选择WorkManager来做延时任务的最佳选择之一。

WorkerManager的工作流程

在后台,WorkManager 根据以下条件使用底层作业来调度服务:

955b30365cc45576088a04ac8792a868.png

🎃Work Request

我们可以创建两种类型的工作请求。

OneTimeWorkRequest → 当我们只处理一次

PeriodicWorkRequest → 当我们以一定的时间间隔来做

🎃 Worker

Coroutinework是要暂停一个DoWork的通过在操作过程中进行必要的处理函数重载这个函数成功 失败条件,我们可以处理。

🌀工作器初始化简易过程。

64f53ef982e62d719ee5604ec4680132.png

我们指定它将使用 OneTimeWorkRequest 触发一次,并将我们的 Worker 类作为参数。我们> 运行使用 WorkManager 创建的 workRequest。

faaef94b5460ec7cc4b58b8099164770.png

doWork函数将在Worker 被触发时运行。

📝向 Worker 发送数据

在构建WorkRequest之前,我们可以设置很多值,其中之一便是setInputData()参数,足以发送属于androidx.work的Data。

73d677522408750b829a36b83c1c8cf2.png

e64b88d3b2911273e356b3ab0e5a9de2.png

在 Worker类中,我们可以获取与inputData一起发送的值及其键。

⚠️ 限制条件

我们可以使用setConstraints()设置一些条件,以便在运行worker之前检查这些条件。

🟢 setRequiresDeviceIdle → 如果我们想让它在进入 Doze 模式时工作,我们只需要将其设置为 true。默认值为假。

🟢 setRequiresNetworkType → 我们可以设置互联网连接状态。

🟢 setRequiresBatteryNotLow → 如果电池电量不低,我们可以设置它的状态。默认值为假。

🟢 setRequiresCharging → 插入状态。默认值为假。

2e86915f098820cd49aa615c0f3d9154.png

⏳Delay

延迟部分对于 OneTimeRequest 会起作用一次,对于临时workder也会以同样的方式起作用,但是这种延迟不会在每次触发时起作用。

225fa6045520784597697c68f7148b19.png

🧐Worker State Observe

我们可以通过状态观察我们在Worker 中所做的过程,有不止一种方法,我们可以在它们之间进行选择。

getWorkInfosByTagLiveData —> getWorkInfosForUniqueWorkLiveData —> getWorkInfoByIdLiveData

本人更偏向使用workRequest的id进行观察,通过将数据分配给Worker中的成功和失败状态,将能够再次接收该数据并对其进行观察。

28fb494316c9a3077deca7095933ba75.png308e48d38f89b297721542f4c9bd6ed8.pnge5a6f352b6efb9ec0db7270a44afbe6c.png

⏱️ 临时worker

它的工作方式与OneTime类似,除此之外我们需要指定作用时间。

ea510b4bc561e25018bbac0c1dc75249.png

但是!会存在一个问题,如果设备处于休眠模式,进程会被搁置;当设备被唤醒时,进程会按顺序再次处理。如果大家希望能准确对进程进行操作,则需要往清单文件中添加一下权限。

uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

1314b49c3f4eca5aa494b117455eb58e.png

官方文档 :

https://developer.android.com/topic/libraries/architecture/workmanager 

https://bugrayetkinn.medium.com/android-workmanager-6bc60dcd17fd 

https://android-developers.googleblog.com/2018/10/modern-background-execution-in-android.html

28294b085a00acf340a5e112e13eddd9.gif

往期推荐

如果让你来设计网络

写时复制就这么几行代码,还是不会?

留不住客户?该从你的系统上找找原因了!

明明还有大量内存,为啥报错“无法分配内存”?

2c10e14fbb1b1ceb8b742f1bad8f58d9.gif

点分享

97e4046f4a1fba09565b0e81f117f681.gif

点收藏

0ade490787f58f840d6d07b423797d6a.gif

点点赞

89c8e419f63db3e1bbf7f0638842d358.gif

点在看

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终端卡顿优化的全记录

简介: 目前手机SOC的性能越来越少,很多程序员在终端程序的开发过程中也不太注意性能方面的优化,尤其是不注意对齐和分支优化,但是这两种问题一旦出现所引发的问题,是非常非常隐蔽难查的,不过好在项目中用到…

brew安装指定版本mysql,Mac 系统为 Valet 开发环境安装指定版本 MySQL

Mac 系统为 Valet 开发环境安装指定版本 MySQL由 学院君 创建于1年前, 最后更新于 5个月前版本号 #31547 views1 likes0 collects在 Mac 系统下使用 Valet 作为 Laravel 本地开发环境的话,需要自行安装 MySQL 数据库,我们通过 Homebrew 来安装。如果之前…

系统架构面临的三大挑战,看 Kubernetes 监控如何解决?

简介: 随着 Kubernetes 的不断实践落地,我们经常会遇到负载均衡、集群调度、水平扩展等问题。归根到底,这些问题背后都暴露出流量分布不均的问题。那么,我们该如何发现资源使用,解决流量分布不均问题呢?今天…

JavaScript 数组你都掰扯不明白,还敢说精通 JavaScript ?| 赠书

作者 | 哪吒来源 | CSDN博客最近小编在看文章的时候,总有很多刚刚入门的小白说精通这个,精通那个技术,更有意思的是,最近看到一则简历上说精通 JavaScript ,聊一聊发现数组还不明白,就对外说精通~所以今天小…

基于消息队列 RocketMQ 的大型分布式应用上云实践

简介: Apache RocketMQ 作为阿里巴巴开源的支撑万亿级数据洪峰的分布式消息中间件,在众多行业广泛应用。在选型过程中,开发者一定会关注开源版与商业版的业务价值对比。 那么,今天就围绕着商业版本的消息队列 RocketMQ和开源版本 …

Gartner发布2022年政府行业主要技术趋势:XaaS、数字化、超自动化等

作者 | Gartner研究副总裁 Bettina Tratz-Ryan Gartner杰出研究副总裁John Kost Gartner高级研究总监 相斌斌 供稿 | Gartner 政府领导人和民选官员在2022年不仅要面对巨大的挑战,还要把握疫情与经济复苏应对措施、不断变化的政治需求和持续数字化变革所带来的机遇…

RedShift到MaxCompute迁移实践指导

简介: 本文主要介绍Amazon Redshift如何迁移到MaxCompute,主要从语法对比和数据迁移两方面介绍,由于Amazon Redshift和MaxCompute存在语法差异,这篇文章讲解了一下语法差异 1.概要 本文档详细介绍了Redshift和MaxCompute之间SQL…

数字农业WMS库存操作重构及思考

简介: 数字农业库存管理系统在2020年时,部门对产地仓生鲜水果生产加工数字化的背景下应运而生。项目一期的数农WMS中的各类库存操作均为单独编写。而伴随着后续的不断迭代,这些库存操作间慢慢积累了大量的共性逻辑:如参数校验、幂…

数字营销行业大数据平台云原生升级实战

简介: 加和科技CTO 王可攀:技术是为业务价值而服务 王可攀 加和科技CTO 本文将基于加和科技大数据平台升级过程中面临的问题和挑战、如何调整数据平台架构以及调整后的变化,为大家介绍数字营销行业大数据平台云原生升级实战经验。主要分为以…

场景模型驱动自动化测试在盒马的探索及实践

简介: 盒马业务有如下几个特点:线上线下一体化、仓储配送一体化、超市餐饮一体化、经营作业一体化、多业态与平台化。在以上的种种原因,生鲜及物流体验是盒马的特点,但仓储配送一体化作业中,如何能更高效的提升测试效率…

基于 KubeVela 的 GitOps 交付

简介: KubeVela 是一个简单、易用、且高可扩展的云原生应用管理和交付平台,KubeVela 背后的 OAM 模型天然解决了应用构建过程中对复杂资源的组合、编排等管理问题,同时也将后期的运维策略模型化,这意味着 KubeVela 可以结合 GitOp…

BCS2022大会将提前至5月 网络安全产业空间扩容将成热门话题

年度网络安全的盛会即将开启。 2022年3月30日,2022年北京网络安全大会(BCS2022)新闻发布会在北京奇安信安全中心召开,宣布2022年北京网络安全大会“提档”至5月24日至26日,并与北辰集团国家会议中心达成战略合作&#…

基于 Istio 的全链路灰度方案探索和实践

简介: 本文介绍的基于“流量打标”和“按标路由” 能力是一个通用方案,基于此可以较好地解决测试环境治理、线上全链路灰度发布等相关问题,基于服务网格技术做到与开发语言无关。同时,该方案适应于不同的7层协议,当前已…

图像检索在高德地图POI数据生产中的应用

简介: 高德通过自有海量的图像源,来保证现实世界的每一个新增的POI及时制作成数据。在较短时间间隔内(小于月度),同一个地方的POI 的变化量是很低的。 作者 | 灵笼、怀迩 来源 | 阿里技术公众号 一 背景 POI 是 Poin…

Redis HyperLogLog 是什么?这些场景使用它~

作者 | 就是码哥呀来源 | 码哥字节在移动互联网的业务场景中,数据量很大,我们需要保存这样的信息:一个 key 关联了一个数据集合,同时对这个数据集合做统计。统计一个 APP 的日活、月活数;统计一个页面的每天被多少个不…

matlab三角形分割,MATLAB 2014b及以上版本中带有画家渲染器的三角形拆分补丁

在解决实际问题之前,这是一个值得怀疑的解决方法:对角线只是三角形之间的空白区域,所以我们看到的是补丁后面的白色空间.愚蠢的想法:让我们用匹配的颜色填充该空间而不是白色.为此,我们将复制所有对象,并通过一个tiiiiny位来抵消新对象.码:hi…

网易云音乐音视频算法的 Serverless 探索之路

简介: 网易云音乐最初的音视频技术大多都应用在曲库的数据处理上,基于音视频算法服务化的经验,云音乐曲库团队与音视频算法团队一起协作,一起共建了网易云音乐音视频算法处理平台,为整个云音乐提供统一的音视频算法处理…

小小的 likely 背后却大有玄机!

作者 | 张彦飞allen来源 | 开发内功修炼今天我给大家分享一个内核中常用的提升性能的小技巧。理解了它对你一定大有好处。在内核中很多地方都充斥着 likely、unlikely 这一对儿函数的使用。随便揪两处,比如在 TCP 连接建立的过程中的这两个函数。//file: net/ipv4/t…

阿里云马涛:因云进化的基础软件

简介: 基础软件的云原生化。 编者按:2021 年10 月20 日,在2021 云栖大会云计算产业升级峰会上,阿里云“因云而生”云原生心智大图正式发布,包含弹性计算、云网络、基础产品、基础设施、操作系统、云安全、开放平台等7个…

阿里云ECI如何6秒扩容3000容器实例?

简介: 2021年云栖大会现场,阿里云工程师演示了在6秒时间内成功启动3000个ECI,并全部进入到Running状态。本文将为你揭开阿里云ECI是如何做到极速扩容的。 引言 根据最新CNCF报告,有超过90%的用户在生产环境使用容器,…