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 的版本和依赖环境有关:
网友评论