当前位置: 移动技术网 > 移动技术>移动开发>Android > 秒懂【Jetpack】WorkManager

秒懂【Jetpack】WorkManager

2020年09月01日  | 移动技术网移动技术  | 我要评论
一、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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网