我的第一篇笔记
刚从群里看到有人提到WorkManager可以管理后台任务的时候,感觉很吊的样子,之前没听说过,刚才浏览了下其他大神们的笔记,略微了解了,特记录下:
WorkManager是什么
WorkManager可以管理和执行后台任务,不管应用是否启动,只要满足设定的条件,应用就可以正常执行。
WorkManager相关的的类
- Worker是一个抽象类,我们必须自定义一个类继承它,实现他的构造方法和doWork()方法,如下:
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
doTask();//执行后台任务
return Result.success();
}
}
doWork()函数的返回值:
- Worker.Result.SUCCESS:任务执行成功
- Worker.Result.FAILURE:任务执行失败。
- Worker.Result.RETRY:任务需要重新执行,需要配合WorkRequest.Builder里面的setBackoffCriteria()函数使用
- WorkRequest代表一个单独的任务,可以对Worker进行包装,可以对Worker任务进行相应的约束,同时它也是一个抽象类,系统提供了两个子类:①OneTimeWorkRequest(任务只执行一遍)、②PeriodicWorkRequest(任务周期性的执行),使用如下:
// 设置限定条件
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED) // 网络状态
.setRequiresBatteryNotLow(true) // 不在电量不足时执行
.setRequiresCharging(true) // 在充电时执行
.setRequiresStorageNotLow(true) // 不在存储容量不足时执行
.setRequiresDeviceIdle(true) // 在待机状态下执行
.build();
//单次任务
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
.setConstraints( constraints )
//设置任务的重试策略,比如我们在Worker类的doWork()函数返回Result.RETRY,让该任务又重新入队。
//BackoffPolicy.LINEAR 线性增加 比如:第一次是2s 那么第二次就是4s
//BackoffPolicy.EXPONENTIAL 指数增加
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL,5,TimeUnit.SECONDS)
.addTag("tag")//设置任务tag
.keepResultsForAtLeast(15, TimeUnit.MINUTES)//设置任务的保存时间
.setInputData("data")//设置任务的传入参数
.build();
//定时任务 时间不能低于15分钟
PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class,15,TimeUnit.MINUTES)
.setConstraints( constraints )
.build();
- WorkerManager 用于管理任务和任务队列
- 链式调用
WorkManager.getInstance(this).beginWith( requestA ).then( requestB ).then( requestC ).enqueue();
- 取消任务
WorkManager.getInstance(this).cancelAllWork();//取消所有任务
WorkManager.getInstance(this).cancelAllWorkByTag("tag");//通过tag取消任务
- 任务的输入输出
- 数据的输入
Data data = new Data.Builder().putString("key","需要传到worker的数据").build();
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class)
.setInputData(data)
.build();
//对任务状态的监听
WorkManager.getInstance(this).getWorkInfoByIdLiveData(request.getId())
.observe((LifecycleOwner) MainActivity.this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
WorkInfo.State workStatus = workInfo.getState();
if (workStatus == null) {
return;
}
if (workStatus == WorkInfo.State.ENQUEUED) {
mBtn.setText("任务入队");
}
if (workStatus == WorkInfo.State.RUNNING) {
mBtn.setText("任务正在执行");
}
if (workStatus.isFinished()) {
Log.e("111","任务完成");
}
}
});
WorkManager.getInstance(this).enqueue(request);
- 数据的获取
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
doTask();//执行后台任务
return Result.success();
}
private void doTask() {
Data inputData = getInputData();
Log.e("worker",inputData.getString("key")+"<数据获取成功");
}
}
结语
还有很多知识点没有整理,准确的说我没来得及测试,所以就不纪录了,如果有不对的地方欢迎指出,因为是第一次写笔记,有没有注意到方面可以@我,随时修改。。。
网友评论