全面认识Android的WorkManager

WorkManager是一个管理work的库,保证在满足约束条件时执行。WorkManager允许观察work的状态,可以创建复杂的work链。所有work都必须保持与Worker通信,以执行计算。另外,work在后台线程运行。

WorkManager支持两种类型的work:OneTimeWorkRequestPeriodicWorkRequest。我们可以这样使用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()

发布了63 篇原创文章 · 获赞 179 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u011686167/article/details/82831532
今日推荐