WorkManager是一个管理work的库,保证在满足约束条件时执行。WorkManager允许观察work的状态,可以创建复杂的work链。所有work都必须保持与Worker通信,以执行计算。另外,work在后台线程运行。
WorkManager支持两种类型的work:OneTimeWorkRequest和PeriodicWorkRequest。我们可以这样使用WorkManager请求入队:
WorkManager workManager = WorkManager.getInstance();
workManager.enqueue(new OneTimeWorkRequest.Builder(FooWorker.class).build());
WorkRequest关联的id可以被这样查询与观察:
WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
workManager.enqueue(request);
LiveData<WorkStatus> status = workManager.getStatusById(request.getId());
status.observe(...);
我们可以根据id来取消work:
WorkRequest request = new OneTimeWorkRequest.Builder(FooWorker.class).build();
workManager.enqueue(request);
workManager.cancelWorkById(request.getId());
我们可以这样进行链式调度:
WorkRequest request1 = new OneTimeWorkRequest.Builder(FooWorker.class).build();
WorkRequest request2 = new OneTimeWorkRequest.Builder(BarWorker.class).build();
WorkRequest request3 = new OneTimeWorkRequest.Builder(BazWorker.class).build();
workManager.beginWith(request1, request2).then(request3).enqueue();
每次调用 beginWith(OneTimeWorkRequest) 或者
beginWith(List) 都会返回WorkContinuation,后面跟着WorkContinuation.then(OneTimeWorkRequest)
或者 WorkContinuation.then(List)来链式调度未来的work。它允许创建复杂的work任务链,例如创建这样的任务链:
A | +----------+ | | B C | +----+ | | D E
我们可以这样入队:
WorkContinuation continuation = workManager.beginWith(A);
continuation.then(B).then(D, E).enqueue(); // A is implicitly enqueued here
continuation.then(C).enqueue();
WorkRequests 可以添加限制,调用inputs()方法;也可以添加人们可读懂的字符串标签(具体查看WorkRequest.Builder.addTag(String))。
WorkManager 默认在后台线程执行。如果已经运行在后台线程,要同步(阻塞)调用WorkManager ,用synchronous()来访问。
我们可以使用cancelAllWork()来取消所有work。如果是取消某个work,可以用cancelAllWorkByTag()或者cancelWorkById()。
至于获取work的状态,可以使用getStatusById()或者getStatusesByTag(),如果UniqueWork,使用getStatusesForUniqueWork()