WorkManager对比AsyncTask, ThreadPool的优势:WorkManager里面的任务在应用退出之后还可以继续执行。AsyncTask, ThreadPool里面的任务在应用退出之后不会执行。WorkManager自动选用JobScheduler, 或是AlarmManager来实现后台任务。
使用WorkManager的一些任务示例:
上载日志、将过滤器应用于图像并保存图像、定期将本地数据与网络同步等。
优点包括:
- 支持异步一次性和定期任务
- 支持网络条件,存储空间和充电状态等约束
- 链接复杂的工作请求,包括并行运行工作
- 一个工作请求的输出用作下一个工作的输入
- LiveData支持可轻松在UI中显示工作请求状态
核心类概述
1 Worker
Worker是一个抽象类,这个类用来指定具体需要执行的任务。使用时要继承这个类并且实现里面的doWork()方法,在其中写具体的业务逻辑。
2 WorkRequest
代表一项任务请求。一个 WorkRequest对象至少要指定一个Worker类。同时,还可以向WorkRequest对象添加 ,指定任务应运行的环境等。每个人WorkRequest都有一个自动生成的唯一ID, 可以使用该ID来执行诸如取消排队的任务或获取任务状态等操作。WorkRequest是一个抽象类; 有两个直接子类 OneTimeWorkRequest和 PeriodicWorkRequest。与WorkerRequest相关的有如下两个类:
① WorkRequest.Builder:用于创建WorkRequest对象的助手类 ,其有两个子类OneTimeWorkRequest.Builder和 PeriodicWorkRequest.Builder,分别对应两者创建上述两种WorkerRequest。
② Constraints:指定任务运行时的限制(例如,“仅在连接到网络时才能运行”)。可以通过 Constraints.Builder来创建该对象,并在调用WorkRequest.Builder的build()方法之前,将其传递 给WorkerRequest。
3 WorkManager
这个类用来安排和管理工作请求。前面创建的WorkRequest 对象通过WorkManager来安排的顺序。 WorkManager调度任务的时候会分散系统资源,做好类似负载均衡的操作,同时会遵循前面设置的对任务的约束条件。
4 WorkStatus
每一个WorkRequest都会有一个WorkStatus与之对应,里面包含了该任务的许多信息,可以通过WorkManager来获取包含WorkStatus的LiveData对象。开发者可以通过观察该LiveData对象来监听与之对应的任务所处的状态,并在任务完成后通过调用WorkStatus的getOutputData()方法获取返回值。
主要流程:
- 给WorkManager发送工作请求WorkRequest。
- WorkManager将该请求的相关参数放入WorkManager的数据库中。
- WorkManager根据设备版本、是否是前台任务等情况将请求操作传递给JobScheduler或者AlarmManager等部件。
- 检查Worker是否满足约束条件,当满足约束条件时调用执行Worker。
广播流程
解释说明:
最少轮询/循环一次 15分钟(Google规定的)一直都是 ENQUEUE状态,因为 你是轮询的任务看不到 SUCCESS
设置约束,WorkManger提供了以下的约束作为Work执行的条件:
* setRequiredNetworkType:网络连接设置
* setRequiresBatteryNotLow:是否为低电量时运行 默认false
* setRequiresCharging:是否要插入设备(接入电源),默认false
* setRequiresDeviceIdle:设备是否为空闲,默认false
* setRequiresStorageNotLow:设备可用存储是否不低于临界阈值
APK清单文件里面(第一次)执行(通过合并AndroidManifest.xml文件的<provider>标签在oncreate方法中完成第一次初始化)
* 1.初始化 数据库 ROOM 来保存你的任务 (持久性保存的) 手机重新,APP被杀掉 没关系 一定执行
* 2.初始化 new GreedyScheduler
* 3.初始化 配置信息 configuration (执行的信息,线程池任务,...)
面试题:WorkManager是干嘛用的?
答:处理非及时任务,举例子:每天同步一次数据到服务器,这种类似的需求,不是及时执行,但是又保证会执行的非及时任务。
面试官 接着问:WorkManager是怎么保证,当我把APP杀掉后呢?
答:记录用户的所有信息并全部保存到数据库,而并非保存在内存中,这样做的好处,就是持久性保存记录,所有APP被杀掉后 依然可以获取所有任务信息。
面试题:你研究过WorKManager源码,任务是怎么保证一定执行的呀?
答:Android操作系统会在系统级别服务中,来判断用户的约束条件,当约束条件满足时就会执行任务,但是触发检测是采用广播的形式处理的,例如:网络连接成功 就触发...。