WorkManager :为我们执行后台任务提供了一站式解决方案

2019-07-02  本文已影响0人  杰子他爸

WorkManager可以用来执行一个在特定条件下触发执行的延时任务。比如我设置触发条件是,手机有网络连接的时候才会触发。当我们断网的时候打开app,我们的任务不会立即执行,当手机联网之后才会触发。

这样我们就可以利用WorkManager轻松实现某些条件下触发的延时任务。

引入

在项目中引入WorkManager包

implementation"android.arch.work:work-runtime:1.0.0-alpha01"

implementation"android.arch.work:work-firebase:1.0.0-alpha01"

使用

首先我们要创建我们的任务类。

doWork会在条件满足的时候触发。

再来看看怎么定义触发规则并把任务添加到WorkManager中。

对,添加到Data的数据不能大于10KB,本来我也以为是10M(火星换算法10240KB=10KB),但是我的数据才十几KB,怎么会超出范围,然后从源码中发现:

可能作者跟大家开了个玩笑。大家跟着笑就行了。哈哈

链式任务

有些时候任务执行前后顺序会影响到结果,需要顺序执行某些任务,又或者后面的任务需要使用前面任务得出的结果,这个时候我们就可以使用链式任务。

1、ABC先后执行

WorkManager.getInstance().beginWith(A).then(B).then(C).enqueue();

2、A,B没有先后顺序,但是A、B均为C的前驱任务

WorkManager.getInstance().beginWith(A,B).then(C).enqueue();

3、A、B和C、D链式执行,执行完之后在执行E

WorkContinuation workContinuation1 = WorkManager.getInstance().beginWith(A).then(B);

WorkContinuation workContinuation2 = WorkManager.getInstance().beginWith(C).then(D);

WorkContinuation workContinuation3 = WorkContinuation.combine(workContinuation1,workContinuation2).then(E).enqueue();

强大的生命力

WorkManager有着强大的存活能力,当我们断网的时候打开app,这个时候任务没有满足触发条件,退出app(进程没有被清除)。这时候连上网络依然会执行任务。

但是当我们结束进程就会出现下面的情况。

我们进行下面的操作。

1、断开网络

2、打开app,这个时候不会执行

3、杀掉应用进程

4、打开网络,第一次的任务没有执行

5、打开app

然后会发现,任务执行了两次。第一次的执行是第一次运行后,加入了任务队列,但还没有执行的任务。

第二次执行是我们第二次打开,因为满足网络连接条件立即执行。

这是 WorkManager 的另一个特点,一旦发起一个任务,任务是可以保证一定会被执行的,就算退出应用,甚至重启手机都阻止不了他。但可能由于添加了环境约束等原因,它执行的时间是不确定的。

原理我们利用网上的一个图片说明。

当应用正在运行时,它会在当前的进程中启用一个子线程执行。应用没有运行的情况下启用,它则会自己选择一种合适的方式在后台运行。具体是什么方式和 Android 的版本和依赖环境有关

上一篇下一篇

猜你喜欢

热点阅读