美文网首页Android-Jetpack
WorkerManager的使用

WorkerManager的使用

作者: 心一如既往的空荡 | 来源:发表于2019-07-25 17:39 被阅读0次

我的第一篇笔记

刚从群里看到有人提到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")+"<数据获取成功");
        }
    }

结语

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

相关文章

  • WorkerManager的使用

    我的第一篇笔记 刚从群里看到有人提到WorkManager可以管理后台任务的时候,感觉很吊的样子,之前没听说过,刚...

  • Android Workermanager使用

    Application贴 oncreate中 WorkManager.getInstance(getApplica...

  • WorkerManager

    根据google官方demo,自己仿写 google例子地址https://github.com/android/...

  • Android WorkerManager 应用帖

    需求 特定的时间更新首页状态,频率较低,2次每天,时间不固定。 解决方案 Jetpack Architecture...

  • iconfont的使用(下载使用)

    1、下载文件 2、在生命周期中引入项目 beforeCreate () { var domModule = ...

  • Gson的使用--使用注解

    Gson为了简化序列化和反序列化的过程,提供了很多注解,这些注解大致分为三类,我们一一的介绍一下。 自定义字段的名...

  • 记录使用iframe的使用

    默认记录一下----可以说 这是我第一次使用iframe 之前都没有使用过; 使用方式: 自己开发就用了这几个属...

  • with的使用

    下面例子可以具体说明with如何工作: 运行代码,输出如下

  • this的使用

    什么是this? this是一个关键字,这个关键字总是返回一个对象;简单说,就是返回属性或方法“当前”所在的对象。...

  • this的使用

    JS中this调用有几种情况 一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象...

网友评论

    本文标题:WorkerManager的使用

    本文链接:https://www.haomeiwen.com/subject/xfshrctx.html