WorkManager的用法
一.WorkManager的作用
绝大部分应用程序都有后台执行任务的需求,根据需求的不同,Android为后台任务提供了多种解决方案,如JobShedule,Loader,Service等。如果这些api没有被正确的使用,则可能导致消耗大量的电量。WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决方案,以便在设备电量和用户体验间达到一个比较好的平衡。WorkManager有三个重要特点,分别如下:
1.针对的是不需要及时完成的任务
2.保证任务一定被执行
3.兼容范围广,最低能兼容API Level14
二.WorkManager的基本使用方法
1.添加依赖:implementation 'androidx.work:work-runtime:2.8.1'
2.使用Work类定义任务
- public class MyWorker extends Worker {
- public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
- super(context, workerParams);
- }
- @NonNull
- @Override
- public Result doWork() {//耗时的任务在doWork()方法中执行
- Log.i("OneTimeWorkRequest","Work Start!");
- String inputData=getInputData().getString("key");//接收WorkManager传递来的数据
- Data outputData=new Data.Builder()
- .putString("key","value")
- .build();
- return Result.success(outputData);//给WorkManager返回数据
- }
- }
doWork()方法有3种类型的返回值:若执行成功,则返回Result.success();若执行失败,则返回Result.failure();若需要重新执行,则返回Result.retry()。
3.使用WorkRequest配置任务
配置任务就是在告诉系统,任务在何时运行及如何运行,下面结合代码讲解
- public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Constraints constraints;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Data inputData=new Data.Builder()
- .putString("key","value")
- .build();
//设置任务触发的条件:需要联网,电量充足,正在充电- constraints=new Constraints.Builder()
- .setRequiredNetworkType(NetworkType.CONNECTED)
- .setRequiresBatteryNotLow(true)
- .setRequiresCharging(true)
- .build();
- OneTimeWorkRequest oneTimeWorkRequest=new OneTimeWorkRequest.Builder(MyWorker.class)//一次性任务
- .setConstraints(constraints)
- .setInitialDelay(10,TimeUnit.SECONDS)//触发条件满足后,延迟10s执行任务
- .addTag("test")//为任务设置tag标签,之后可以通过标签跟踪任务的状态,或者取消任务
- .setBackoffCriteria(BackoffPolicy.LINEAR,OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)//设置指数退避策略,例如当Worker线程的执行出现了异常,如服务器宕机,你希望一段时间后重试该任务
- .setInputData(inputData)//传递数据给Worker
- .build();
- WorkManager.getInstance(this).getWorkInfoByIdLiveData(oneTimeWorkRequest.getId()).observe(this, new Observer<WorkInfo>() {//获取WorkInfo对象,实时监测任务的状态
- @Override
- public void onChanged(WorkInfo workInfo) {
- if(workInfo!=null&&workInfo.getState()==WorkInfo.State.SUCCEEDED){
- String value = workInfo.getOutputData().getString("key");//获取Worker返回的数据
- }
- }
- });
- WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);//将任务提交系统
- }
- }
4.将任务提交系统:WorkManager.getInstance(this).enqueue(oneTimeWorkRequest);
5.观察任务的状态,任务提交系统后,可以通过WorkInfo获知任务的状态,有三种方式获取WorkInfo对象:
(1)WorkManager.getWorkInfosByTag()
(2)WorkManager.getWorkInfoById()
(3)WorkManager.getWokInfosForUniqueWork()
如果希望实时获取任务的状态,这三个方法还有对应的LiveData方法,在方法后面加上LiveData即可。
6.WorkManager与Worker之间的参数传递
WorkManager通过setInputData()方法向Worker传递数据,数据的传递通过Data对象来完成,需要注意的是,Data只能用于传递一些小的基本类型的数据。
Worker通过getInputData()方法接收数据,并在任务完成后向WorkManager返回数据,通过return Result.success(outputData),然后WorkManager通过LiveData得到从Worker返回的数据。
7.周期性任务PeriodicWorkRequest
WorkRequest有两种实现方式,OneTimeWorkRequest和PeriodicWorkRequest,即一次性任务和周期性任务。周期性任务使用方式和一次性任务类似,不过需要注意的是,周期性任务的时间间隔不能少于15分钟。
new PeriodicWorkRequest.Builder(Upload.class,15,TimeUnit.MINUTES).build();只需要做此修改,其他地方一样
8.任务链
如果有一系列的任务需要按顺序执行,那么可以利用WorkManager.beginWith().then().then()...enqueue();
- WorkManager.getInstance(this)//先1后2
- .beginWith(firstWorkRequest)
- .then(secondWorkRequest)
- .enqueue();
- or
- WorkManager.getInstance(this)//先1和2;1和2不分先后,然后再3
- .beginWith(firstWorkRequest,secondWorkRequest)
- .then(thirdWorkRequest)
- .enqueue();
WorkManager的用法的更多相关文章
- 如何使用WorkManager执行后台任务(下)
0x00 WorkManager的高级用法 在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法: 链式任务调用 唯一任务序列 传递参数和获取返回值 0x01 链式任 ...
- Android Jetpack之WorkManager: 观察结果
在使用WorkManager的时候,有时候需要关注任务执行的结果和状态,可以使用 LiveData<WorkInfo> liveOpStatus = WorkManager.getInst ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
随机推荐
- 2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0 0 0]。 package main import ( “fmt“ )
2022-07-16:以下go语言代码输出什么?A:[]:B:[5]:C:[5 0 0 0 0]:D:[0 0 0 0 0]. package main import ( "fmt" ...
- 2022-06-28:以下golang代码输出什么?A:true;B:false;C:panic;D:编译失败。 package main import “fmt“ func main() {
2022-06-28:以下golang代码输出什么?A:true:B:false:C:panic:D:编译失败. package main import "fmt" func ma ...
- 日增数据超10PB!揭秘沃尔玛Lakehouse架构选型之路
沃尔玛系统产生了世界上最大和最多样化的数据集之一,每天数据增长超 10 PB. 来自许多不同的来源及其支持的后端系统,一系列大量的业务事件流被发送到主要由 Apache Kafka 支持的消息传递层. ...
- 记一次 Visual Studio 2022 卡死分析
一:背景 1. 讲故事 最近不知道咋了,各种程序有问题都寻上我了,你说 .NET 程序有问题找我能理解,Windows 崩溃找我,我也可以试试看,毕竟对 Windows 内核也知道一丢丢,那 Visu ...
- CST为什么要关闭 GPU 卡的 ECC 模式而开启 TCC 模式?操作使用【详解】
在使用CST软件之前,我们一般建议大家关闭 GPU 卡的 ECC 模式而开启 TCC 模式.那么,为什么要进行这样一个操作呢?在此之前,给大家科普一下什么是"ECC"和" ...
- 人手一个 Midjourney,StableStudio 重磅开源!
人手一个 Midjourney,StableStudio 重磅开源! Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型,包含了 30 亿和 70 ...
- 如何借助Kafka持久化存储K8S事件数据?
大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时. $ kubectl get even ...
- Linux(redhat)镜像
作为一个合格的程序猿,Linux那就是必须得会玩哟呵,搜集了一些镜像分享大家,望笑纳. 云盘地址https://pan.baidu.com/s/1cB-llYI5RdRm9xJDmjFoWg 提取码 ...
- Linux 大页内存 Huge Pages 虚拟内存
Linux为什么要有大页内存?为什么DPDK要求必须要设置大页内存?这都是由系统架构决定的,系统架构发展到现在,又是在原来的基础上一点点演变的.一开始为了解决一个问题,大家设计了一个很好的方案,随着事 ...
- ODOO升级可能遇到问题
a,找不到模块或视图不存在. 解决方案:查看是否将相应py文件加入到__init__文件中,或xml文件加入到manifest->data文件中. b, 找不到关联模块. 解决方案:这种一般要么 ...