欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

秒懂【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

秒懂【Jetpack】WorkManager

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

相关标签: ANDROID