开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情
前言
WorkManager是jetpack库包中强大的后台工作管理库。在android高版本对后台限制越来越严的现状下,了解并学习使用WorkManager库已经是迫在眉睫的事情了。本文主要来给大家分享now android项目中的WorkManager使用示例。如果你对WorkManager库不熟悉,建议务必先通过官网文档或者通过我之前写的文章来学习。
官方文档
后台工作利器-WorkManager(Part1) - 掘金 (juejin.cn)
后台工作利器-WorkManager(Part2) - 掘金 (juejin.cn)
项目代码
上篇文章我们介绍了Startup库,知道了app在启动的时候通过WorkManager做了一个初始化操作。但是我们在不了解WorkManager的前提下很难看懂它具体做了什么。现在我们在学习了WorkManager基础知识后,再来看看。应该很简单的就能看懂了。
直接看WorkManager在Startup的初始化器中的代码如下:
WorkManager.getInstance(context:Context)拿到WorkManager的全局单例。然后入列一个唯一名是
"SyncWorkName"并且指定如果队列中已有此唯一名工作时就保持老的工作忽略此工作的政策的WorkRequest。此WorkRequest通过SyncWorker.startUpSyncWork()返回。那么我们再来看看SyncWorker。
SyncWorker类继承了CoroutineWorker,那么我们就知道了,在do Work方法中支持写入挂起函数了。这里的Hilt是jetpack库包下的依赖注入库,不了解的话没关系,不影响本章的内容理解。后面我们会单独写文章来介绍Hilt库。感兴趣的xdm可以持续关注。如果对挂起函数不理解的话,可以去看看协程相关的知识,这里可以先简单理解挂起函数是一个不堵塞主线程的耗时操作就行。
先看第一个重写的方法
getForegroundInfo()。这个方法是android版本兼容性相关的。如果android版本小于12,在执行加急任务时,会开启一个前台服务并通知用户。 这里需要注意哈,如果是加急工作但是又没有实现这个方法,那么在低版本中运行时崩溃,在高版本(>=12) 中抛出异常。所以这个地方大家不能偷懒。现在我们看看项目里面是如何实现的
扩展函数直接调用了ForegroundInfo的构造函数来返回上面说到的getForegroundInfo()方法需要的ForegroundInfo实例。构造函数需要传入了一个int类型的通知频道id,这个我们可以自定义。然后需要传入一个Notification类型的通知。然后syncWorkNotification()函数里面返回了一个通知。到此我们就实现了getForegroundInfo()方法。下面再看重写的第二个方法
这个doWork方法就是Worker要做的具体内容了。这里涉及到了另外一个比较冷门的库tracing库,这个库主要是配合性能检测和优化用的。后面有机会我们再来慢慢看,暂时先不管。只需了解这里主要干的事情就是执行了两个操作,每个操作返回一个布尔值。在开始操作之前写入了一个开始点,然后执行操作,如果两个都是true那么返回一个成功的结果,否则失败,最后在写入一个结束点。下面还有两个Synchronizer接口的实现,跟我们今天的内容无关大家不用关注。到此Worker类的创建结束。WorkManager3要素,Worker,WorkRequest,WorkManager我们已经有了2个了,下面再来看看WorkRequest的构建
OneTimeWorkRequestBuilder一次性工作请求构建器;setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)设置加急,如果不满足就不加急;setConstraints(SyncConstraints)这是约束条件,全部满足才运行;setInputData(SyncWorker::class.delegatedData())配置数据供Worker使用。
这里细心地兄弟们可能发现了,OneTimeWorkRequestBuilder<>泛型里面是DelegatingWorker类而不是SyncWorker。根据类名我们能想到,这个DelegatingWorker应该是SyncWorker的委托类。最后我们再来看一眼这个类
构建work request时配置数据调用的扩展函数
这里是把调用类的类名传了进去
小结
大家可以看出,项目示例的WorkManager使用的很简单,但是其实在我们的开发中的很多复杂场景都是可以用到这个库的。WorkManager可以保证我们在后台稳定的按照我们指定的顺序和约束执行一次或周期性的工作,并且支持延迟开始,链式执行。还提供了过程中可观察的能力,让我们可以灵活的处理过程中出现的各种情况。
最后希望这篇文章能帮助到XDM在自己项目中去使用WorkManager。
水平有限,欢迎大家评论交流。
jym点赞涨人品,收藏不迷路啊。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情