热门搜索 :
考研考公
您的当前位置:首页正文

WorkerManager的使用

来源:东饰资讯网

我的第一篇笔记

刚从群里看到有人提到WorkManager可以管理后台任务的时候,感觉很吊的样子,之前没听说过,刚才浏览了下其他大神们的笔记,略微了解了,特记录下:

WorkManager是什么

WorkManager可以管理和执行后台任务,不管应用是否启动,只要满足设定的条件,应用就可以正常执行。

WorkManager相关的的类

  1. Worker是一个抽象类,我们必须自定义一个类继承它,实现他的构造方法和doWork()方法,如下:
public class MyWorker extends Worker {
    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        doTask();//执行后台任务
        return Result.success();
    }
    
}

doWork()函数的返回值:

  • Worker.Result.SUCCESS:任务执行成功
  • Worker.Result.FAILURE:任务执行失败。
  • Worker.Result.RETRY:任务需要重新执行,需要配合WorkRequest.Builder里面的setBackoffCriteria()函数使用
  1. WorkRequest代表一个单独的任务,可以对Worker进行包装,可以对Worker任务进行相应的约束,同时它也是一个抽象类,系统提供了两个子类:①OneTimeWorkRequest(任务只执行一遍)、②PeriodicWorkRequest(任务周期性的执行),使用如下:
// 设置限定条件
Constraints constraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)  // 网络状态
                .setRequiresBatteryNotLow(true)                 // 不在电量不足时执行
                .setRequiresCharging(true)                      // 在充电时执行
                .setRequiresStorageNotLow(true)                 // 不在存储容量不足时执行
                .setRequiresDeviceIdle(true)                    // 在待机状态下执行
                .build();
//单次任务
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
                .setConstraints( constraints )
                //设置任务的重试策略,比如我们在Worker类的doWork()函数返回Result.RETRY,让该任务又重新入队。
                //BackoffPolicy.LINEAR 线性增加 比如:第一次是2s 那么第二次就是4s
                //BackoffPolicy.EXPONENTIAL 指数增加
                .setBackoffCriteria(BackoffPolicy.EXPONENTIAL,5,TimeUnit.SECONDS)
                .addTag("tag")//设置任务tag
                .keepResultsForAtLeast(15, TimeUnit.MINUTES)//设置任务的保存时间
                .setInputData("data")//设置任务的传入参数
                .build();
//定时任务   时间不能低于15分钟
PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class,15,TimeUnit.MINUTES)
                .setConstraints( constraints  )
                .build();
  1. WorkerManager 用于管理任务和任务队列
  • 链式调用
    WorkManager.getInstance(this).beginWith( requestA ).then( requestB ).then( requestC ).enqueue();
  • 取消任务
    WorkManager.getInstance(this).cancelAllWork();//取消所有任务
    WorkManager.getInstance(this).cancelAllWorkByTag("tag");//通过tag取消任务
  • 任务的输入输出
- 数据的输入
 Data data = new Data.Builder().putString("key","需要传到worker的数据").build();
        OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
                .setInputData(data)
                .build();
        //对任务状态的监听
        WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.getId())
        .observe((LifecycleOwner) MainActivity.this, new Observer<WorkInfo>() {
            @Override
            public void onChanged(WorkInfo workInfo) {
                WorkInfo.State workStatus = workInfo.getState();
                if (workStatus == null) {
                    return;
                }
                if (workStatus == WorkInfo.State.ENQUEUED) {
                    mBtn.setText("任务入队");
                }
                if (workStatus == WorkInfo.State.RUNNING) {
                    mBtn.setText("任务正在执行");
                }
                if (workStatus.isFinished()) {
                    Log.e("111","任务完成");
                }
            }
        });
        WorkManager.getInstance(this).enqueue(request);

- 数据的获取
    public class MyWorker extends Worker {
        public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
              super(context, workerParams);
        }
         @NonNull
        @Override
        public Result doWork() {
              doTask();//执行后台任务
              return Result.success();
        }
        private void doTask() {
            Data inputData = getInputData();
            Log.e("worker",inputData.getString("key")+"<数据获取成功");
        }
    }

结语

还有很多知识点没有整理,准确的说我没来得及测试,所以就不纪录了,如果有不对的地方欢迎指出,因为是第一次写笔记,有没有注意到方面可以@我,随时修改。。。

Top