强大好用的WorkManager

autotask

博主之前做过这样一个需求,手机端向服务器请求数据,当没有网络时,不要请求,有网络时自动恢复请求。
应对这个需求,专门写了一个autotask模块,大体的思路就是每次请求的时候都去判断一下网络的状态,如果此时网络处于连接状态,则直接请求;如果网络处于断开状态,则将请求保存在队列当中,接收网络状态广播,一旦网络连接上,则将队列当中的请求一个一个的执行。
其实这个需求可以再抽象一点,当任务暂时不满足某种条件时,先保存到队列,一旦任务满足了某种条件,则执行。正当我准备按照自己的思路对autotask进行拓展的时候,发现官方出了workmanager,能够很好的应对这种场景,而且功能也非常的强大。

workmanager

workmanager简单使用

1.在项目里面引入workmanager

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

2.创建worker类

public class HttpWork extends Worker{
    @NonNull
    @Override
    public WorkerResult doWork() {
        //接收传进来的参数
        String str = this.getInputData().getString("demo","");
        Log.i("HttpWork","执行了哦"+str);
        return WorkerResult.SUCCESS;
    }
}

3.执行work

//1.约束条件
Constraints myconstraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
//2.传入参数
Data data = new Data.Builder().putString("demo","helloworld").build();
//3.构造work
OneTimeWorkRequest httpwork = new OneTimeWorkRequest.Builder(HttpWork.class).setConstraints(myconstraints).setInputData(data).build();
//4.放入执行队列
WorkManager.getInstance().enqueue(httpwork);

以上这个任务,当网络连接的时候任务就会自动执行。其中约束条件除了网络连接之外还可以支持电量,充电,存储,待机这几个状态条件。

Constraints constraints = new Constraints.Builder()
                .setRequiresBatteryNotLow(true)//不在电量不足时执行
                .setRequiresCharging(true)//在充电时执行
                .setRequiresStorageNotLow(true)//不在存储容量不足时执行
                .setRequiresDeviceIdle(true)//在待机状态执行
                .build();
高级特性

1.周期任务
例子当中使用的是OneTimeWorkRequest,任务只会执行一次,如果需要执行周期性任务可以使用PeriodicWorkRequest。

PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(HttpWork.class,15, TimeUnit.SECONDS).setConstraints(myconstraints).setInputData(data).build();

2.任务链
有时候我们执行多个任务需要有先后顺序,任务链可以很优雅的解决这个问题。
1.任务ABC顺序执行

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

这里写图片描述

2.任务A和B同时执行,它们都执行完了之后再执行C

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

这里写图片描述

3.任务链1和任务链2同时执行,它们都执行完了之后再执行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);
workContinuation3.enqueue();

这里写图片描述

总结

用了WorkManager之后,感觉自己的autotask真是简陋,不过也可以做一下对比,看一下差距,并从中学习和提高。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值