你竟然还不知道 新架构组件:WorkManager?

Android WorkManager使用介绍 WorkManager 是google提供的异步执行任务的管理框架,是 Android Jetpack 的一部分,会根据手机的API版本和应用程序的状态来选择适当的方式执行任务。 阅读详情

一. WorkManager的一句话介绍

其实就是"管理一些要在后台工作的任务, -- 即使你的应用没启动也能保证任务能被执行".

1. 为何不用JobScheduler, AlarmManger来做?

: 其实这个想法很对. WorkManager在底层也是看你是什么版本来选到底是JobScheduler, AlamarManager来做. JobScheduler是Android 5.x才有的. 而AlarmManager一直存在. 所以WorkManager在底层, 会根据你的设备情况, 选用JobScheduler, Firebase的JobDispatcher, 或是AlarmManager

2. 为啥不用AsyncTask, ThreadPool, RxJava?

: 这一点就要特别说明一下了. 这三个和WorkManager并不是替代的关系. 这三个工具, 能帮助你在应用中开后台线程干活, 但是应用一被杀或被关闭, 这些工具就干不了活了. 而WorkManager不是, 它在应用被杀, 甚至设备重启后仍能保证你安排给他的任务能得到执行.

其实Google自己也说了:"WorkManager并不是为了那种在应用内的后台线程而设计出来的. 这种需求你应该使用ThreadPool"

二. 例子例子

还是show me the code吧.

1. 导入WorkManager

app/build.gradle中加入

[kotlin]

implementation "android.arch.work:work-runtime-ktx:1.0.0-alpha01"

[java]

implementation "android.arch.work:work-runtime:1.0.0-alpha01"

2. 一个定期Pull的例子

以我在2012年做过的一个项目为例, 当时我在做一个电商项目. 我们有一个需求是要定时推给用户一些我们推荐的单品, 但是当时集团还没有push service组件呢, 所以我们当时为了及时上线, 选用的策略是"pull策略". 客户端定时去后台拉取, 看有没有新的推荐.

这时我们要分两步走. 第一步是确定要干什么活(去后台pull推荐信息); 第二步是让这个活入队列.

代码上我们也分两步

  1. Worker是干活的主体. 它只管轮到了它时要做的工作. 不管其它的东西(如何时轮到它, 它的ID, ...).

这里要新建个Worker的子类, 重写它的doWork()方法.

class PullWorker : Worker() {
    override fun doWork(): WorkerResult {
        // 模拟设置页面中的"是否接受推送"是否被勾选
        val isOkay = this.inputData.getBoolean("key_accept_bg_work", false)
        if(isOkay) {
            Thread.sleep(5000) //模拟长时间工作

            val pulledResult = startPull()
            val output = Data.Builder().putString("key_pulled_result", pulledResult).build()
            outputData = output
            return WorkerResult.SUCCESS
        } else {
            return WorkerResult.FAILURE
        }
    }

    fun startPull() : String{
        return "szw [worker] pull messages from backend"
    }
}
复制代码
  1. 把Worker包装成一个WorkRequest, 并入列 WorkRequest就多了一些新属性: 如: ID(一般是一个UUID, 以保证唯一性), 何时执行, 有没有限制(如只有在充电并连网时才执行此任务), 执行链 (当某任务执行完了, 才能轮到我执行) WorkManager就负责把WorkRequest入列
class PullEngine {
    fun schedulePull(){
        //java就请用PeriodicWorkRequest.Builder类
        val pullRequest = PeriodicWorkRequestBuilder<PullWorker>(24, TimeUnit.HOURS)
                .setInputData(
                    Data.Builder()
                        .putBoolean("key_accept_bg_work", true)
                        .build()
                )
                .build()
        
        WorkManager.getInstance().enqueue(pullRequest)
    }
}
复制代码

3. 讲解

1.干活的是Worker类. 我们一般是新建个Worker的子类, 并重写doWork()方法. 但是, doWork()方法是没有参数的. 我们有时有参数的需求,怎么办? 这时就要用上Worker.getInputData()方法了.

2.同理, doWork()方法是返回void的. 你要是有结果想传出去, 就可以用Worker.setOutputData()

3.上面的两个方法所得到/设置的数据类型都是Data. 这个Data很类似我们Android中的Bundle, 也有putInt(key, value), getString(key, defaultValue)这样的方法.

一般Data的生成, 是用Data.Builder类. 如:

val output = Data.Builder().putInt(key, 23).build()
复制代码

4.上面讲了WorkRequest其实就是入列的一个实体, 它包装了Worker在内. 但我们一般不直接使用WorkReqeust类, 多是用它的子类: OneTimeWorkRequest, 或是PeriodWorkReqeust.

因为我们的pull需求是每天都要去拉一次, 所以这里我们没有用OneTimeWorkRequest, 而是构建了一个24小时就重复干活的PeriodicWorkReqeust.

三. 进阶

1. 想拿到结果

WorkManager提供了一个接口让我们拿到结果, 这个东东就是WorkStatus. 你可以由id得到你想要的那个任务的WorkStatus. 这个WorkStatus其实就是知道这任务没有完成, 有什么返回值.

因为前后台要解耦合的原因, 所以这个工作其实是由LiveData来完成的. 既然有LiveData, 那我们肯定要有一个LifecycleOwner了(一般是我们的AppcompatActivity).

来看个例子. 以上面的pull例子为例, 若我们拉到了结果, 就显示一个notification (这里为简便, 是收到结果后就打印一下日志).

[PullEngine.kt]
class PullEngine {
    fun schedulePull(){
        val pullRequest = PeriodicWorkRequestBuilder<PullWorker>(24, TimeUnit.HOURS).build()
        WorkManager.getInstance().enqueue(pullRequest)

        // 下面两行是新加的, 用来存任务的ID
        val pullRequestID = pullRequest.id
        MockedSp.pullId = pullRequestID.toString() // 模拟存在SharedPreference中
    }
}

复制代码
[PullActivity.kt]
class PullActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // UUID实现了Serializable接口. 也能由toString(), fromString()与String互转
        val uuid = UUID.fromString(MockedSp.pullId)
        WorkManager.getInstance().getStatusById(uuid)
                .observe(this, Observer<WorkStatus> { status ->
                    if (status != null){
                        val pulledResult = status.outputData.getString("key_pulled_result", "")
                        println("szw Activity getResultFromBackend : $pulledResult")
                    }
                })
    }
}

复制代码

注意, observe()方法是用来监听嘛. 它的参数分别是: observer(LifecycleOwner, Observer<WorkStatus>)

2. 总结入参/返回值

入参: 
WorkRequest.Builder.setInputData()

Worker类: 可以getIntpuData(), 以及setOutputData()

返回值: 由LiveData监听, 可以得到WorkStatus. 而WorkStatus就有getOutputDat()方法

只是注意,这里说的inputData, outputDat, 都不是普通的int, string. 而是Data类.

3. 如果任务执行完了, 应用却没被启动怎么办? 会强行启动应用来显示UI变化吗?

: 好问题. 但严格来说, 这个其实不是WorkManager的问题, 而是LiveData的问题. LiveData自己本身就是和Activity的生命周期绑定的. 你不用说应用被杀了, 就是你退出了这个注册的Activity, 你都收不到LiveData的通知. 所以说你的应用被杀, 任务又执行完了时, 是没有UI通知的, 更不会强行启动你的启动. (这有点流氓~)

4. 任务链

WorkManager.getInstance()
    .beginWith(workA)
    .then(workB)
    .then(workC)
    .enqueue()
复制代码

这样就会按workA, workB, workC的顺序来执行. workA执行完了, 才会接着执行workB.

WorkManager甚至还能执行:

A --> B
        --> E
C --> D
复制代码

这样的形式, 即A执行完了才执行了B, C执行完才执行D. B,D都执行完了才执行E.

5. 插入任务时, 已经有相同的任务时, 怎么办?

WorkManager可以用beginUniqueWork()来执行唯一工作队列("unique work sequence"). 若有任务有重复时, 怎么办?

这个主要是一个ExistingWorkPolicy类. 这个类也是WorkManager包中的类. 它其实是一个Enum. 其值有:

  • REPLACE: 用新任务来取代已经存在的任务
  • KEEP: 保留已经存在的任务. 忽视新任务
  • APPEND: 新任务入列. 新旧任务都存在于队列中.

四. 总结

总体来说, WorkManager并不是要取代线程池/AsyncTask/RxJava. 反而是有点AlarmManager来做定时任务的意思. 即保证你给它的任务能完成, 即使你的应用都没有被打开, 或是设备重启后也能让你的任务被执行.

WorkManager在设计上设计得比较好. 没有把worker, 任务混为一谈, 而是把它们解耦成Worker, WorkRequest. 这样分层就清晰多了, 也好扩展. (如以后再有一个什么WorkRequest的子类出来)

最后, WorkManager的入参出参设计得不错. WorkReqeust负责放入参数, Worker处理并放置返回值, 最后WorkStaus中取出返回值, 并由LiveData来通知监听者.

至于链式执行, 唯一工作队列这些特性在你有类似的需求时, 也能帮助到你.

最近博主建了一个学习交流Qqun:925895158,欢迎小白,大佬前来学习

 

深入探秘 WorkManager:Android 异步任务管理的强大工具 WorkManager 是 Google 提供的一个异步任务管理框架,它的主要目标是帮助开发者更轻松地管理应用中的异步任务,确保任务在合适的时间和条件下执行,同时提供了强大的功能和灵活性,以满足各种应用场景的需求。WorkManager 的设计理念是将异步任务的管理与应用的生命周期解耦,使得任务的执行不受应用是否处于前台或后台的影响。 阅读详情

相关推荐

Android架构组件JetPack之WorkManager完全解析(五)(1)

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84132685的博客 1209

WorkManager概述及运用

WorkManager 一、概述 WorkManager是针对一些即使App退出了也要由系统确保运行的任务设计的,可以延迟执行后台任务,提供了电量友好型API WorkManager可以轻松让异步任务延迟执行以及何时运行他们。我们可以给WorkManager设置一个任务,然后选择相应运行的环境,并在符合条件时将其交给WorkManager运行,即使该应用被强制退出,此任务仍可保证运行。 WorkManager在应用运行时执行任务会开一个新线程执行,在应用未运行时会自动选择JobScheduler、Fireb

weixin_46019119的博客 4965

Android架构组件-WorkManager(1)

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84010457的博客 1188

WorkManager的基本使用

在app目录下的build.gradle导入依赖库// 导入WorkManager依赖。

xuyin1204的博客 2357

Android Jetpack架构组件(七)之WorkManager

一、WorkManager简介 在Android应用开发中,或多或少的会有后台任务的需求,根据需求场景的不同,Android为后台任务提供了多种不同的解决方案,如Service、Loader、JobScheduler等。后台任务通常用在不需要用户感知的功能,并且后台任务执行完成后需要即时关闭任务回收资源,如果没有合理的使用这些API就会造成电量的大量消耗。 为了解决Android电量大量消耗的问题,Android官方做了各种优化尝试,从Doze到app Standby,通过添加各种限制和管理应用程序进程来包

xiangzhihong8的专栏 878

Android新架构组件WorkManager

注:原文地址 5月8号, I/O大会上又推出了两个新的Architeture Component库: Navigation与 WorkManager. 这里就先介绍一下 WorkManager。 WorkManager简介 其实就是”管理一些要在后台工作的任务, – 即使你的应用没启动也能保证任务能被执行”。 1. 为何不用JobScheduler, AlarmManger来做? 其实这...

xiangzhihong8的专栏 4402

Android8.0后时代的后台任务JetPack-WorkManager详解

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 WorkManager详解 一、回顾一下以前的做法 以前我们在处理后台任务时,一般都是使用Service(含IntentService)或者线程/线程池,而Service不受页面生命周期影响,可以常驻后台,所以很适合做一些定时...

chuanao8829的博客 1179

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线

本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。

weixin_26878995的博客 241

Android架构之WorkManager组件

Workmanager的作用 绝大部分应用程序都有在后台执行任务的需求。根据需求的不同,Android为后台任务提供了多种解决方法,如JobScheduler、Loader、Service等。 如果这些API没有被恰当地使用,则可能会消耗大量的电量。Android在解决应用程序耗电问题上做出了各种尝试,从Doze到App Standby,通过各种方法限制和管理应用程序,以保证应用程序不会再后台过分消耗设备的电量。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方法,以便在设备电

qq_43404873的博客 1916

非凸问题的求解方法以及连续凸逼近SCA(Successive Convex Approximation)方法

非凸问题的求解方法 针对形如下式的函数: min⁡x∈XV(x)=F(x)+G(x)\min\limits_{{\bf{x}}\in X} V(x)=F(x)+G(x)x∈Xmin​V(x)=F(x)+G(x); 其中F为光滑的(不一定convex),G是convex的但是可能不可微,且存在:对于n维实矢量空间,有X=X1×...×XNX=X_1 \times...\times X_NX=X1​×...×XN​; x=(x1,...,xN)\bf{x} =(x_1,...,x_N)x=(x1​,...,xN

weixin_44535200的博客 2万+

STM32+OOK通讯(OOK发送+OOK接收)+cubemx配置

关于OOK通信,我的理解就是将要发送的信息转换成高低电平(即0和1),然后接收方通过对01进行解码获得信息。于是我用了非常朴素的字符串转二进制+AM调制来完成通信链。话不多说我们直接开始!!!

qq_73856732的博客 2342

Android架构组件-WorkManager

使用WorkManager安排任务 WorkManager API可以轻松指定可延迟的异步任务以及何时运行,这些API可让您创建任务并将其交给WorkManager,以便立即或在适当的时间运行。例如,应用程序可能需要不时从网络下载新资源。...

不学习傻了吧 2万+

高通量测序数据分析:RNA-seq

深度测序相关数据库与数据格式 SRA toolkit 一、NCBI 和EBI、DDBJ组成INSDC,数据内容相同所以找NCBI就行。 (一)NCBI常用数据库 GenBank:遗传序列数据库,收集了所有公开的DNA序列及其注释 GEO (Gene Expression Omnibus) :收集整理各种表达芯片数据,后来加入了甲基化、lncRNA、miRNA、CNV等其他芯片,还有高通量测序数据...

qq_41134363的博客 3万+

Android Jetpack架构组件之WorkManager入门

——你可以失望,但不能绝望。累的时候可以慢一点,千万不要后退,你还没有拼劲全力。怎么知道没有奇迹。 前言 ——这篇主要是梳理一下Jetpack架构组件之一的Navigation,并结合楼主所学做个总结。面向那些还没接触Navigation的同学们。看完这篇可以快速了解它,并轻松使用。也想请教前辈们指点文章中的错误或不足的地方。本篇只描述Navigation,不会拓展额外的知识,...

斌林诚上的博客 1015

Ubuntu20.04安装Ceres库

ceres真难安装。

little_white138的博客 8382

利用XGBoost实现短期电力负荷预测

本数据集为某地区2009年-2015年的用电负荷,时间片为每分钟这里我们定义了XGB模型作为实例,来进行模型训练,之后我们会对其使用网格搜索找到最优的参数。

优快云 精品推荐 4497

Jetpack架构组件库:WorkManager

工作使用Worker类定义。Worker类的doWork()方法在提供的后台线程上异步运行。如需为创建一些要运行的工作,请继承Worker类并重写doWork()方法。从doWork()返回的Result会通知服务工作是否成功,以及工作失败时是否应重试工作。:工作成功完成。:工作失败。:工作失败,应根据其重试政策在其他时间尝试。默认情况下,当您的应用启动时,WorkManager 使用适合大多数应用的合理选项自动进行配置。

川峰的博客 1740

Java小白入门200例81之Java接口

作者简介 作者名:编程界明世隐 简介:优快云博客专家,从事软件开发多年,精通Java、JavaScript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞! 引言 很多Java初学者问我,新手明明很用心、很努力学习的Java知识,转头又忘记了,很让人犯愁,小白如何能够快速成长、成为大牛呢? 其实要成为大神的技巧只有一个:“多学多练”,于是明哥就整理了比较典型的练习实例,通过练习能够快速提升编码技巧和熟练度,让你在成为大

编程界明世隐的博客 1359

Android 架构组件之 WorkManager

文章目录1. 什么是后台任务?2. 为什么要使用 WorkManager?3. 通过一个简单的案例,介绍如何使用 WorkManager4. 分析 WorkManager 的组成及原理4.1 WorkManager 的组成4.2 WorkManager 的原理。5. WorkManager 的高级用法5.1 创建任务链5.2 观察后台任务的状态6. 总结参考链接 WorkManager是一个兼容性...

小白GT's Blog 1034

C#客户端对接工厂MES的方法

本文介绍了使用C#实现WebApi客户端与工厂MES系统交互的方法。主要包括四个步骤:1)配置工控机IP地址;2)获取服务器URL;3)创建HttpHelper帮助类实现单例模式HttpClient,提供异步POST请求方法;4)通过实例化帮助类实现设备状态数据的JSON格式发送与接收。该方案采用异步通信方式,支持超时处理,能够满足大多数MES系统交互需求,帮助工程师快速完成设备与MES系统的数据对接。文中给出了核心代码片段和完整的数据交互流程示例。

weixin_39832501的博客 267

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 架构组件之 WorkManager 的使用指南及项目实践

Android 架构组件之 WorkManager 的使用指南及项目实践

小羊子的技术专栏 4359

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android Jetpack架构组件(八)WorkManager使用篇

前言 WorkManager是Jetpack很重要的一个组件,本篇我们就先来讲讲它是如何使用的,在讲解之前我们先了解关于后台处理的一些痛点。 后台处理指南 我们知道每个 Android 应用都有一个主线程,它负责处理界面(包括测量和绘制视图)、协调用户互动以及接收生命周期事件。如果有太多工作在主线程中进行,则应用可能会挂起或运行速度变慢,从而导致用户体验不佳。任何长时间运行的计算和操作(例如解...

周将的博客 2657

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android架构组件WorkManager详解

&nbsp; &nbsp; &nbsp; &nbsp;WorkManager架构组件是用来管理后台工作任务。这个时候你可能会奇怪了Android不是已经 有很多管理后台任务的类了么,比如JobScheduler, AlarmManger、在比如AsyncTask, ThreadPool。WorkManager。WorkManager的优势在哪里,我们为啥要使用WorkManager。我们从两个方面...

旧路 1万+

Android 新架构组件: WorkManager

&#13; &#13; &#13; &#13; &#13; &#13; &#13; 热文导读 | 点击标题阅读欢迎加入Java和Android架构知识星球一个支付宝 App竟使用了30...

Java和Android架构 1010

笔记之Android架构组件-WorkManager

kotlinOptions { jvmTarget = 1.8 } // Kotlin + coroutines implementation "androidx.work:work-runtime-ktx:2.3.1" WorkManager的简单使用 创建后台任务,并且实现具体的任务逻辑。 配置后台运行任务运行条件和约束条件,并且构建后台任务请求 将后天任务请求传入WorkManager.enqueue()中,系统会在合适的时间运行。 1. 创建.

易帜¤的博客 546

Android Jetpack 组件库 ->WorkManager

WorkManager是Android官方推荐的后台任务调度框架,解决了传统方式手动管理后台任务的诸多问题。它通过声明式任务调度,自动处理系统限制(如Doze模式、电池优化),保证任务最终执行,并支持约束条件、自动重试和链式任务。核心组件包括WorkManager(调度器)、WorkRequest(任务请求)、Worker(执行者)和WorkInfo(任务状态)。WorkManager支持一次性任务、周期性任务和链式任务,开发者可通过设置约束条件、输入输出数据等实现灵活控制。相比传统方案,WorkManag

Mark Wu 的博客 1290
上一篇: 互联网校招面试必备——Java多线程
下一篇: 我的面试标准:1.能干活;2.Java基础好;3.熟悉分布式框架
Java架构技术官
博客等级 码龄6年 9粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值