android WorkManger 使用攻略

文章目录

        • `WorkManager` 使用攻略
          • 导入依赖库
          • 最简单的`WorkerManager`
          • 添加一些配置选项
          • 监听`Worker`的执行情况
          • 关联多个任务一起执行
          • 取消一个未完成的任务
          • 执行周期性任务
          • 执行“特殊”任务
          • 自定义`WorkManager`初始化参数

WorkManager 使用攻略

WorkManager是 Android JetPack 的一部分。是用于执行后台任务的。

导入依赖库

对应的库:implementation "android.arch.work:work-runtime:1.0.1"

最简单的WorkerManager

一个简单的 WorkManger 执行,需要包含一个Worker, 一个WorkRequest.
比如:

public class MouseWorker extends Worker {
    public MouseWorker(@NonNull Context context, 
                       @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        // 子线程
        LogUtils.e(Thread.currentThread().getName());
        return Result.success();
    }
}
// 执行该  worker
WorkManager.getInstance().enqueue(new OneTimeWorkRequest.Builder(MouseWorker.class).build());

这里的 doWork()的返回值Result,除了 Result.success();还有 失败与重试两种不同的结果。

添加一些配置选项
// Create a Constraints object that defines when the task should run
Constraints constraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
     .build();

// ...then create a OneTimeWorkRequest that uses those constraints
OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(CompressWorker.class)
     .setConstraints(constraints) // 添加约束
     .build();

OneTimeWorkRequest uploadWorkRequest = new OneTimeWorkRequest.Builder(UploadWorker.class)
        .setInitialDelay(10, TimeUnit.MINUTES) // 延时执行
        .build();

这里的 Constraints提供了好几个 set方法,比如,是不是充电中这些。

监听Worker的执行情况
WorkManager.getInstance().getWorkInfoByIdLiveData(uploadWorkRequest.getId())
        .observe(lifecycleOwner, new Observer() {
            @Override
            public void onChanged(@Nullable WorkInfo workInfo) {
              if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
                  displayMessage("Work finished!")
              }
            }
        });
//  lifecycleOwner 是一个接口, AppCompatActivity, Fragment 都实现了这个接口
// 所以,如果是在 activity 里面监听,可以直接传入 this.
关联多个任务一起执行
WorkManager.getInstance()
    // Candidates to run in parallel
    .beginWith(Arrays.asList(filter1, filter2, filter3))  // 这里的 1,2,3 会被并行执行
    // Dependent work (only runs after all previous work in chain)
    .then(compress) // 然后执行该任务
    .then(upload) // 然后执行该任务
    // Don't forget to enqueue()
    .enqueue();

这个有点类型很多 pipline工具里面配置,可以并行,可以串行。可以先串行 1,2,3然后并行4,5,最后再串行一个 6.

取消一个未完成的任务
WorkManager.cancelWorkById(workRequest.getId());

// 还有好几个cancleXXX() 的方法,参数不同。
执行周期性任务
Constraints constraints = new Constraints.Builder()
        .setRequiresCharging(true)
        .build();

PeriodicWorkRequest saveRequest =
        new PeriodicWorkRequest.Builder(SaveImageFileWorker.class, 1, TimeUnit.HOURS)
                  .setConstraints(constraints)
                  .build();

WorkManager.getInstance()
    .enqueue(saveRequest);
执行“特殊”任务
OneTimeWorkRequest oneWorkRequest = new OneTimeWorkRequest.Builder(OneWorker.class)
                            .setInputMerger(ArrayCreatingInputMerger.class).build();
                    String uniqueWorkName = "unique";
                    WorkManager.getInstance()
                            .enqueueUniqueWork(uniqueWorkName, ExistingWorkPolicy.APPEND,
                                    oneWorkRequest);

这里的“特殊”任务,特殊的地方就是需要一个新的参数:ExistingWorkPolicy ,这是一个枚举值。分别代表不同的含义。如果上一个名字相同的特殊任务没有执行完成,那么现在要怎么做? 3个值见名知意,非常容易理解。

特殊任务也是可以串行与并行多个的。调用方式是
WorkManager.getInstance().beginUniqueWork(xxx) ...;
WorkManager.getInstance().enqueueUniqueWork(xx)...

自定义WorkManager初始化参数
  1. 去掉默认初始值:
        
  1. 自定义自己的初始值:
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Configuration configuration = new Configuration.Builder()
                .setExecutor(Executors.newFixedThreadPool(8)) // 设置 Workmanager 的后台线程
                .build();
        WorkManager.initialize(this, configuration);
    }
}

// 官方文档 的操作,可是我本地死活找不到 Configuration.Provider 这个类
class MyApplication extends Application implements Configuration.Provider {
    @Override
    public Configuration getWorkManagerConfiguration() {
        return Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.INFO)
                .build();
    }
}

ps: 从文档来看,WorkerManagerJobScheduler 没有直接的关联。使用上,也不一定要互相关联。

参考链接:

  • https://developer.android.google.cn/topic/libraries/architecture/workmanager

你可能感兴趣的:(学习笔记,android)