秒懂【Jetpack】WorkManager
程序员文章站
2022-07-03 17:32:33
一、Worker 任务的执行者,是一个抽象类,用于指定需要执行的具体任务,需要实现doWork() 这一个方法,它是执行在一个单独的后台线程里的。所有需要在后台执行的任务都在这个方法里完成。 doWork()函数的返回值:Worker.Result.SUCCESS:任务执行成功。Worker.Result.FAILURE:任务执行失败,与其串联的Worker2将不会执行Worker.Result.RETRY:任务需要重新执行,如果出现这个返回结果,就需要与Wo......
一、Worker
任务的执行者,是一个抽象类,用于指定需要执行的具体任务,需要实现doWork() 这一个方法,它是执行在一个单独的后台线程里的。所有需要在后台执行的任务都在这个方法里完成。
doWork()函数的返回值:
- Worker.Result.SUCCESS:任务执行成功。
- Worker.Result.FAILURE:任务执行失败,与其串联的Worker2将不会执行
- Worker.Result.RETRY:任务需要重新执行,如果出现这个返回结果,就需要与WorkRequest.Builder中的setBackoffCriteria()函数一起使用。
getInputData获取参数
二、WorkRequest
WorkRequest代表一个单独的任务,是对Worker任务的包装,一个WorkerRequest对应一个Worker.可以通过WorkRequest给Worker添加约束条件,
具体实现类:OneTimeWorkRequest(任务只执行一次)
PeriodicWorkRequest(周期性执行,最少15分钟,小于15分钟,默认改为15分钟)
OneTimeWorkRequest requestC = new OneTimeWorkRequest.Builder(ConbineWorkerC.class)
.setConstraints(constraints)
.setInputData(data)
.build();
2.1WorkRequest.Builder
WorkRequest的帮助类,通过Builder来创建WorkRequest对象及设置参数
常用API:
- setBackoffCriteria() 设置重试策略,Worker的doWork函数返回Result.RETRY,让该任务又重新入队。api>=26
- setConstraints() 设置约束条件
- setInputData() 设置任务参数
- addTag() 添加任务的tag
2.2Constraints
对任务运行的约束条件,也是通过builder来构建
Constraints constraints = new Constraints.Builder()
.setRequiresCharging(true)//指定要运行的{@link WorkRequest}是否应该插入设备
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)//指定设备电池是否不应低于临界阈值
.setRequiresCharging(true)//网络状态
// .setRequiresDeviceIdle(true)//指定{@link WorkRequest}运行时设备是否为空闲,api>=23
.setRequiresStorageNotLow(true)//指定设备可用存储是否不应低于临界阈值
// .addContentUriTrigger("myUri",false)//指定内容{@link android.net.Uri}时是否应该运行{@link WorkRequest}更新,api>=24
.build();
三、Data
使用跟bundle差不多
Data data = new Data.Builder()
.putInt("params1", 1)
.putString("params2", "hello")
.build();
四、WorkInfo
livedata监听
WorkManager.getInstance()
.getWorkInfoByIdLiveData(requestC.getId())
.observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
Log.e("workInfo", "workInfo:" + workInfo.toString());
}
});
五、WorkManager
/**
* 任务入队
*/
public final void enqueue(@NonNull WorkRequest... workRequests);
public abstract void enqueue(@NonNull List<? extends WorkRequest> workRequests);
/**
* 链式结构的时候使用,从哪些任务开始。
* 比如我们有A,B,C三个任务,我们需要顺序执行。那我们就可以WorkManager.getInstance().beginWith(A).then(B).then(C).enqueue();
*/
public final @NonNull WorkContinuation beginWith(@NonNull OneTimeWorkRequest...work);
public abstract @NonNull WorkContinuation beginWith(@NonNull List<OneTimeWorkRequest> work);
/**
* 创建一个唯一的工作队列,唯一工作队列里面的任务不能重复添加
*/
public final @NonNull WorkContinuation beginUniqueWork(
@NonNull String uniqueWorkName,
@NonNull ExistingWorkPolicy existingWorkPolicy,
@NonNull OneTimeWorkRequest... work);
public abstract @NonNull WorkContinuation beginUniqueWork(
@NonNull String uniqueWorkName,
@NonNull ExistingWorkPolicy existingWorkPolicy,
@NonNull List<OneTimeWorkRequest> work);
/**
* 允许将一个PeriodicWorkRequest任务放到唯一的工作序列里面去,但是当队列里面有这个任务的时候你的提供替换的策略。
*/
public abstract void enqueueUniquePeriodicWork(
@NonNull String uniqueWorkName,
@NonNull ExistingPeriodicWorkPolicy existingPeriodicWorkPolicy,
@NonNull PeriodicWorkRequest periodicWork);
/**
* 通过UUID取消任务
*/
public abstract void cancelWorkById(@NonNull UUID id);
/**
* 通过tag取消任务
*/
public abstract void cancelAllWorkByTag(@NonNull String tag);
/**
* 取消唯一队列里面所有的任务(beginUniqueWork)
*/
public abstract void cancelUniqueWork(@NonNull String uniqueWorkName);
/**
* 取消所有的任务
*/
public abstract void cancelAllWork();
/**
* 获取任务的WorkStatus。一般会通过WorkStatus来获取返回值,LiveData是可以感知WorkStatus数据变化的
*/
public abstract @NonNull LiveData<WorkStatus> getStatusById(@NonNull UUID id);
public abstract @NonNull LiveData<List<WorkStatus>> getStatusesByTag(@NonNull String tag);
/**
* 获取唯一队列里面所有的任务(beginUniqueWork)的WorkStatus
*/
public abstract @NonNull LiveData<List<WorkStatus>> getStatusesForUniqueWork(@NonNull String uniqueWorkName);
六、WorkContinuation
任务链,看后面具体例子
七、Demo
有ABCDE五个任务,AB需要串联执行,CD需要串联执行,AC并联,E要等ABCD都执行成功后再执行。
OneTimeWorkRequest requestA = new OneTimeWorkRequest.Builder(ConbineWorkerA.class).build();
OneTimeWorkRequest requestB = new OneTimeWorkRequest.Builder(ConbineWorkerB.class).build();
OneTimeWorkRequest requestC = new OneTimeWorkRequest.Builder(ConbineWorkerC.class).build();
OneTimeWorkRequest requestD = new OneTimeWorkRequest.Builder(ConbineWorkerD.class).build();
OneTimeWorkRequest requestE = new OneTimeWorkRequest.Builder(ConbineWorkerE.class).build();
//A,B任务链
WorkContinuation continuationAB = WorkManager.getInstance()
.beginWith(requestA)
.then(requestB);
//C,D任务链
WorkContinuation continuationCD = WorkManager.getInstance()
.beginWith(requestC)
.then(requestD);
List<WorkContinuation> list = new ArrayList<>();
list.add(continuationAB);
list.add(continuationCD);
//AC并列执行,A执行完之后执行B,C执行完之后执行D,都执行完之后执行E
WorkContinuation.combine(list).then(requestE).enqueue();
本文地址:https://blog.csdn.net/qq_34400960/article/details/108582463