一.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的用法的更多相关文章

  1. 如何使用WorkManager执行后台任务(下)

    0x00 WorkManager的高级用法 在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法: 链式任务调用 唯一任务序列 传递参数和获取返回值 0x01 链式任 ...

  2. Android Jetpack之WorkManager: 观察结果

    在使用WorkManager的时候,有时候需要关注任务执行的结果和状态,可以使用 LiveData<WorkInfo> liveOpStatus = WorkManager.getInst ...

  3. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  4. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  5. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  6. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  7. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  8. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  9. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  10. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

随机推荐

  1. 2021-11-04:计算右侧小于当前元素的个数。给你`一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右

    2021-11-04:计算右侧小于当前元素的个数.给你`一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧 ...

  2. Django4全栈进阶之路2 创建虚拟环境、项目、app应用、启动运行项目

    一.安装虚拟环境: 命令:pip3 install virtualenv 二.安装管理工具: 命令:pip3 install virtualenvwrapper 三.新建: 命令:python -m ...

  3. Accurate SerDes LineRate

    测试现象:(单板A板载7A series,单板B板载7K series) 1. 单板A板载2个type C接口,通过线缆自环,GTP near-end loopback, OK. 2. 2块单板A,使 ...

  4. [安全开发] SQL注入扫描(一股子GPT味~)

    实际上大部分都是它写的,它真我哭 SQL注入扫描就是一种用于检测和预防SQL注入攻击的工具.它通过模拟SQL注入攻击的方式,向目标网站发送特定的SQL查询语句,以验证目标网站是否存在SQL注入漏洞.S ...

  5. nodejs和npm升级版本

    由于服务器环境的不同可能需要根据实际情况升降对应的nodejs 及npm 版本,最简单的例子就是 npx 只适用于 npm 5+ 看想用npx 那不升级咋办呢,还有如error eslint@7.16 ...

  6. vue横向导航条滚动到顶部固定同时瞄点对应内容(copy即用)

    这里监听window 的scroll实现一个页面滚动,导航菜单定位,内容联动的一个简单组件,结合一些案例,按需进行了整合,在此记录一下 效果图如下 具体实现如下 一.先创建一个NavigateTool ...

  7. 技术招聘漫谈 | 正在招Golang工程师的你,赶快收藏这份识人秘籍!

    各位技术面试官,欢迎来到新一期的技术招聘漫谈专栏. 在前两期的专栏中,我们解析了前端工程师以及 Java 工程师 这两个常见技术岗位的招聘技巧. 今天,我们想把目光聚焦在一个前景与"钱&qu ...

  8. C端用户体验度量实战篇-京东快递小程序体验度量全面升级

    本文通过介绍体验度量模型升级研究过程.研究方法及研究结果等内容,结合实际C端产品应用,观测新模型运行周期的表现,验证了其在高速发展的业务形态和日益变化的用户需求上的适用性和有效性.我们从体验价值为导向 ...

  9. Kafka关键原理

    日志分段切分条件 日志分段文件切分包含以下4个条件,满足其一即可: 当前日志分段文件的大小超过了broker端参数 log.segment.bytes 配置的值.log.segment.bytes参数 ...

  10. CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(上篇)

    前言 考虑到 B+ 树较为复杂,CMU15-445 将 B+ 树实验拆成了两部分,这篇博客将介绍 Checkpoint#1 部分的实现过程,搭配教材 <DataBase System Conce ...