美文网首页
Android Jetpack架构组件之WorkManager入

Android Jetpack架构组件之WorkManager入

作者: ana生 | 来源:发表于2020-03-04 17:25 被阅读0次

是什么?

WorkManager是Android Jetpack 中管理后台任务的组件。

常见的使用场景:1.向后端服务发送日志或分析数据 2.定期将应用数据与服务器同步

有什么用?

使用 WorkManager API 可以轻松地调度后台任务。可延迟运行(即不需要立即运行)并且在应用退出(进程未关闭)或应用重启时能够可靠运行的任务。

有什么优点?

1.兼容JobScheduler与BroadcastReceiver 和 AlarmManager
2.工作约束满足多种情况
3.可使用一次性或周期性执行的任务
4.监控和管理计划任务
5.提供API将任务链接起来
6.遵循低电耗模式等省电功能

基本使用

1.添加依赖

 implementation android.arch.work:work-runtime:1.0.1

2.创建后台任务(自定义类 继承 Worker 并重写doWork())

public static class MyWorker extends Worker {

public MyWorker(@NonNull Context context, @NonNull WorkerParameters params) {
    super(context, params);
}

@Override
public Result doWork() {
    return Result.success();//返回成功
//      return Result.failure();//返回失败
//      return Result.retry();//重试
}
}

3.创建请求

// 对于一次性 WorkRequest,请使用 OneTimeWorkRequest,对于周期性工作,请使用 PeriodicWorkRequest.
// 构建一次性请求
// OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class).build();
// 构建周期性请求
// PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class,1,     TimeUnit.HOURS).build();

4.执行请求(如果没有设置约束条件则会立即执行)

WorkManager.getInstance().enqueue(request);

5.取消和停止工作

WorkManager.getInstance().cancelWorkById(request.getId());

进阶

1.进阶1:构建约束条件:

Uri uri = Uri.parse("xxxxx");
Constraints constraints = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED) //指定需要在有网的情况下
    .setRequiresBatteryNotLow(true)//指定电量在可接受范围内运行
    .setRequiresStorageNotLow(true)//指定在存储量在可接受范围内运行
    .addContentUriTrigger(uri,true)//当Uri发生变化的时候运行
    .setRequiresDeviceIdle(true)//当设备处于空闲状态时运行
    .setRequiresCharging(true)//当设备处于充电状态时运行
    .build();
//在请求
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
            .setConstraints(constraints)//添加约束
            .build();
//当满足约束条件后才会执行该任务
WorkManager.getInstance().enqueue(request);

2.进阶2:延迟执行

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
            .setInitialDelay(1,TimeUnit.HOURS)//延迟1小时执行
            .build();

3.进阶3:设置回退/重试的策略 当doWork()返回 Result.retry()时启用 指定重试间隔时长

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
            //第一个参数:设置策略模式。
            //第二个参数:设置第一次重试时长
            //第三个参数:设置时间单位
            .setBackoffCriteria(BackoffPolicy.LINEAR,
                    OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                    TimeUnit.MILLISECONDS)
            .build();

4.进阶4:传入参数/标记请求任务

Data imageData = new Data.Builder()
    .putString(DateKey, "开始执行")
    .build();
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
            //传入参数
            .setInputData(imageData)
            .build();
@Override
public Result doWork() {
//获取传入的参数
String data = getInputData().getString(DateKey);
LogUtils.e("data:"+data);
//创建输出结果
Data outputData = new Data.Builder()
        .putString(DateKey,"已经开始充电")
        .build();
return Result.success(outputData);
}

5.进阶5:标记请求任务

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
            .addTag(TAG)
            .build();
            //取消使用特定标记的所有任务
//        WorkManager.getInstance().cancelAllWorkByTag(TAG);
//会返回 LiveData 和具有该标记的所有任务的状态列表
//        WorkManager.getInstance().getWorkInfosByTagLiveData(TAG); 

6.进阶6:监听工作状态

WorkManager.getInstance().getWorkInfoByIdLiveData(request1.getId())
            .observe(this, new Observer<WorkInfo>() {
                @Override
                public void onChanged(@Nullable WorkInfo workInfo) {
                    if (workInfo != null && (workInfo.getState() == WorkInfo.State.SUCCEEDED)){
                        //获取成功返回的结果
                        tvText.setText(workInfo.getOutputData().getString(DateKey));
                    }
                }
            });

7.进阶7:链接工作:用于指定多个关联任务并定义这些任务的运行顺序(可以执行多个任务)

OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class).build();
OneTimeWorkRequest request1 = new OneTimeWorkRequest.Builder(MyWorker.class).build();
OneTimeWorkRequest request2 = new OneTimeWorkRequest.Builder(MyWorker.class).build();
OneTimeWorkRequest request3 = new   OneTimeWorkRequest.Builder(MyWorker.class).setInputMerger(OverwritingInputMerger.class).build();
OneTimeWorkRequest request4 = new OneTimeWorkRequest.Builder(MyWorker.class).build();
//        为了管理来自多个父级 OneTimeWorkRequest 的输入,WorkManager 使用 InputMerger。
//        WorkManager 提供两种不同类型的 InputMerger:
//        OverwritingInputMerger 会尝试将所有输入中的所有键添加到输出中。如果发生冲突,它会覆盖先前设置的键。
//        ArrayCreatingInputMerger 会尝试合并输入,并在必要时创建数组。

WorkManager.getInstance()
    //使用beginWith()可以并行执行request、request1、request2 
    .beginWith(Arrays.asList(request, request1, request2)).
    //使用then()可以按顺序执行任务
    .then(request3)//在执行request3
    .then(request4)//在执行request4
    .enqueue();

相关文章

网友评论

      本文标题:Android Jetpack架构组件之WorkManager入

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