我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:九肖六肖三肖全年资料 > 取标记组件 >

Android架构组件-WorkManager

归档日期:06-06       文本归类:取标记组件      文章编辑:爱尚语录

  首先我们来看下WorkManager的定义,WorkManager API可以轻松地让异步任务延迟执行以及何时运行它们,这些API可让我们创建任务并将其交给WorkManager,以便立即或在适当的时间运行。例如,应用程序可能需要不时从网络下载新资源,我们可以使用WorkManager API设置一个任务,然后选择适合它运行的环境(例如“仅在设备充电和联网时”),并在符合条件时将其交给 WorkManager 运行,即使该应用程序被强制退出或者设备重新启动,这个任务仍然可以保证运行。

  注意:WorkManager适用于那些即使应用程序退出,系统也能够保证这个任务正常运行的场景,比如将应用程序数据上传到服务器。它不适用于应用进程内的后台工作,如果应用进程消失,就可以安全地终止,对于这种情况,推荐你使用线程池。

  WorkManager会根据移动设备的API级别和应用程序状态等因素选择适当的方式来运行我们的任务,如果WorkManager在应用程序运行时执行其中一项任务,则WorkManager可以在应用进程中开启一个的新线程中运行这个任务。如果你的应用程序未运行,WorkManager将选择合适的方式来安排后台任务 - 这取决于设备API级别和应用包含的依赖关系,WorkManager可能使用JobScheduler,Firebase JobDispatcher或AlarmManager。我们完全不需要编写设备逻辑来确定设备具有哪些功能并选择适当的API,相反,我们可以将任务交给WorkManager并让它选择最佳选项。

  此外,WorkManager提供了几个高级功能,例如,我们可以建立一连串的任务,当其中一个任务完成时,WorkManager会顺序处理下一个任务;我们还可以通过观察任务的LiveData来检查任务的状态以及它的返回值,如果你想通过展示 UI来指示任务的进度,这个特性会非常有用。

  WorkManager API使用了几个不同的类,在某些情况下,我们需要继承其中一个API类。

  WorkRequest:代表一个单独的任务。一个WorkRequest对象指定哪个Woker类应该执行该任务,而且,我们还可以向WorkRequest对象添加详细信息,指定任务运行的环境等。每个WorkRequest都有一个自动生成的唯一ID,我们可以使用该ID来执行诸如取消排队的任务或获取任务状态等内容。WorkRequest是一个抽象类,在代码中,我们需要使用它的直接子类,OneTimeWorkRequest或PeriodicWorkRequest.。

  假设我们正在开发一个照片库应用,并且该应用程序需要定期压缩其存储的图像,我们想使用 WorkManager API 调度图像压缩任务,在这种情况下,我们并不需要关心压缩发生在何时,我们只需要设置这个任务然后就可以忘记它。

  首先,我们需要定义自己的Worker类,然后重写此类的doWork()方法,我们需要指定Worker类如何执行这个操作,但是不应该出现任何关于任务在何时运行的信息。

  WorkManager会选择适当的时间运行这个任务,平衡诸如系统负载,设备是否插入等考虑因素。在多数情况下,如果我们没有指定任何约束条件,WorkManager会立即运行我们的任务。如果我们需要检查任务的状态,我们可以通过获取合适的LiveData WorkStatus的句柄来获取WorkStatus对象。例如,如果我们想检查任务是否完成,可以使用如下代码:

  如果我们愿意,我们还可以限制任务运行的时间。例如,我们可能想要指定该任务只在设备闲置并接通电源时运行。在这种情况下,我们需要创建一个OneTimeWorkRequest.Builder对象,并使用这个构造器创建实际的OneTimeWorkRequest:

  当我们将任务入列后,我们还可以取消这个任务。要取消任务,我们需要这个任务的Work ID,当然Work ID可以从WorkRequest对象中获取。例如,以下代码将取消上一节中的compressionWork请求:

  WorkManager会尽最大努力取消任务,但实质上这是不确定的 - 当我们尝试取消任务时,任务可能已经运行或完成。WorkManager还提供方法来取消唯一工作序列(这个概念在下面会讲到)中的所有任务,或尽最大努力的取消具有指定标记的所有任务。

  WorkManager API 的核心功能可以使开发者能够创建简单的、即开即忘的任务,除此之外,API 还提供了高级功能,可以让我们设置更多精准的请求。

  我们可能需要重复执行一项任务,例如,照片管理应用不会只想压缩其照片一次。更有可能的是,它会希望每隔一段时间检查一次照片,并查看是否有任何新的或改变的图像需要压缩,这个循环任务可以压缩它找到的图像,或者它可以启动新的“压缩图像”任务。

  WorkManager尝试按照我们请求的时间间隔运行任务,但要受到我们施加的限制和其他要求的限制。

  有时候我们想让应用程序按照特定的顺序运行多个任务。WorkManager允许我们创建和排队多个任务的工作序列,以及它们应该以什么顺序运行。

  WorkManager根据每个任务的指定约束以请求的顺序运行任务,如果任何任务返回Worker.WorkerResult.FAILURE,则整个序列结束。

  我们还可以将多个OneTimeWorkRequest对象传递给beginWith()和.then()调用中的任何一个。如果我们将多个OneTimeWorkRequest对象传递给单个方法调用,那么WorkManager将在运行序列中其余部分任务前运行所有这些任务(并行)。例如:

  我们可以通过使用ine()方法连接多个链来创建更复杂的序列。例如,假设我们想要像下图运行一个序列:

  注意:虽然WorkManager依次运行每个子链,但不能保证链1中的任务与链2中的任务重叠,例如,workB可能在workC之前或之后运行,或者它们可能同时运行。唯一可以保证的是每个子链中的任务将按顺序运行,也就是说,workB在workA完成之后才开始。

  我们要想创建一个唯一的工作序列,只需调用beginUniqueWork()而不是beginWith().来开始序列。每个唯一的工作序列都有一个名字,WorkManager一次只允许一个工作序列使用该名称,当我们创建一个新的唯一工作序列时,如果已经有一个未完成的序列具有相同的名称,则指定WorkManager应执行的操作:

  如果我们有一个不应该多次入队的任务,则唯一工作序列可能很有用。例如,如果我们的应用需要将其数据同步到网络,我们可能会排列一个名为“sync”的序列,并指定如果已经有一个具有该名称的序列,则应该忽略我们的新任务。如果我们需要逐步建立一个长期的任务链,那么唯一的工作序列也会很有用,例如,照片编辑应用可能会让用户撤消一长串的操作,每个撤销操作可能需要一段时间,但必须按正确的顺序执行,在这种情况下,应用程序可以创建一个“撤消”链并根据需要将每个撤销操作追加到链中。

  我们可以通过将字符串标签指派给任何WorkRequest对象,将我们的任务按照逻辑分组。要设置标签,请调用WorkRequest.Builder.addTag(),例如:

  例如,假设我们有一个执行耗时计算的Worker类,Worker类类似于下面的代码:

  如果我们链接任务,则一个任务的输出可用作链中下一个任务的输入。如果它是一个简单的链,并且OneTimeWorkRequest后跟另一个OneTimeWorkRequest,第一个任务通过调用setOutputData()返回结果,下一个任务通过调用getInputData()来获取结果。如果链更复杂,例如,多个任务都将输出发送到随后的一个任务,我们可以在OnTeMeWorkRealth.Builder上定义一个InputMerger,以指定如果不同的任务返回具有相同key的输出应该发生什么。

  autotask博主之前做过这样一个需求,手机端向服务器请求数据,当没有网络时,不要请求,有网络时自动恢复请求。应对这个需求,专门写了一个autotask模块,大体的思路就是每次请求的时候都去判断一下...博文来自:我是黄大仙

  作者:ronaldong链接:随着Android版本的不断更新,如何正确的处......博文来自:Android技术之家

  总述从事安卓开发,对四大组件应该都相当熟悉,这个在面试的时候也会经常出现,其实service一直被用来做后台运行的操作,包括一些保活,上传数据之类的,这个后台运行的弊端很多,比如耗电,比如设计用户隐私...博文来自:jifashihan的博客

  AndroidWorkManager谷歌在今年的GoogleI/O上宣布了一项非常令人兴奋的功能,该功能允许开发人员执行传统上需要详细了解各种API级别和可用于这些API的后台任务库的后台任务(简单点...博文来自:Charon_Chui的专栏

  1、前言最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。And...博文来自:浅谈Android

  WorkManager定义:WorkManagerAPI可以轻松地让异步任务延迟执行以及何时运行它们,这些API可让我们创建任务并将其交给WorkManager,以便立即或在适当的时间运行。例如,应用...博文来自:wa172126691的博客

  前言一直使用Qt来进行桌面端和移动端开发,对Android开发并不熟悉,但是项目中往往又经常会用到Android原生开发的东西。本次收集了一些关于BindService相关的知识供自己学习和参考。正文...博文来自:luoyayun361的专栏

  学习了定时执行任务功能。并写了个demo学习研究下。参考blog:Android中定时执行任务的3种实现方法androidservice后台执行定时任务...博文来自:violetjack的专栏

  使用Room将数据保存在本地数据库中使用Room实体定义数据使用主键注释索引和唯一性定义对象之间的关系创建嵌套对象使用RoomDAO访问数据为方便起见定义方法插更新删除查询信息简单的查询将参数传递给查...博文来自:不学习傻了吧

  作为AndroidJetpack中的新组件,WorkManager负责用来管理后台任务,它和一个异步任务以及Service有什么区别呢?看完你就知道了。相关类我们先来看看WorkManager相关的几...博文来自:SouthernBox的博客

  使用WorkManager,您可以轻松设置任务并将其交给系统,以便在您指定的条件下运行。本概述介绍了最基本的WorkManager功能。在此页面中,您将学习如何设置任务,指定应运行的条件,并将其交给系...博文来自:攻城狮for Android

  作者:DmitriMaximovich时间:2005-11-2319:53出处:bea 到目前为止,人们还没有发现一种途径可以方便地在J2EE应用程序中启动执行并行任务。设想您的应用程序需要处理多个客...博文来自:周狼赤壁的技术博客

  转载:原文地址时间来到2018年的当下,当我们讨论后台处理任务的时候,一般可能涉及...博文来自:syb001chen的博客

  #需求:需要定时的调用接口,来检测后台数据的变化。看到文章说workmanager是今年谷歌推荐了,然后我也是新手,没试过AlarmManager和JobScheduler,就想着试试workmana...博文来自:weixin_40119478的博客

  Android7.0包括对证书安装、密码重置、二级用户管理、设备标识符访问权限的变更。您必须先安装授权证书安装程序,然后DPC才能对其进行设置对于面向NSDK的配置文件和设备所有者应用,您应在设备规范...博文来自:专栏

  Androidforwork是什么AndroidforWork(以下简称Afw)是由google主导开发的一套旨在支持Android在企业中运用的一套方案。这套方案可以实现在同一台设备上同时支持工作应...博文来自:光着脚丫行一生的专栏

  1、前言最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。And...博文来自:浅谈Android

  需求特定的时间更新首页状态,频率较低,2次每天,时间不固定。解决方案JetpackArchitecture增加了一个workerManager,帮我们兼容了不同的APIlevel,并且可以根据手机当前...博文来自:weixin_34032792的博客

  一.在状态栏之上弹自定义吐司1.需求:UI设计师设计的原型图是在状态栏之上的位置弹一个自定义吐司,我们的应用内全部都是沉浸式状态栏,将状态栏隐藏掉了的。2.解决方案:首先给toast设置marginT...博文来自:刘旭

  文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:对于时间较长处理一般不放在UI线程(即主线程...

  与传统的桌面应用程序不同,Android应用程序的结构要复杂得多,在大多数情况下,它们只在桌面快捷启动方式中有一个入口,并且作为单个进程运行。一个典型的Android应用程序是由多个app组件(And...

  ViewModel是google官方的MVVM架构组件,目前已经集成到了最新的支持库中了,是MVVM架构的核心组件之一。不懂MVVM的请看之前的文章:(一)Android官方MVVM框架实现组件化之整...

  1为什么需要架构组件?之前的开发过程中,我们会把所有的代码写在Activity或者Fragment中,包含网络请求,数据处理,UI更新,生命周期回调的处理。但是在后期不断的迭代和需求变多的情况下,会使...

  Android架构组件(一)——Lifecycle-AwareComponents有一天“谷歌开发者”官微推送了《正式发布Android架构组件1.0稳定版附带中文介绍视频》,发现这种架构足够秒杀M...

  关注code小生,每日一篇技术推送!作者:秦川小将地址:声明:本文是秦川小将原创投稿,转发等...

  有的时候取出全部数据库记录也许正好满足你的要求,不过,在大多数情况下我们通常只需得到部分记录。这样一来该如何设计查询呢?当然会更费点脑筋了,何况本文也存心不想让你去用那个什么劳什子的recordset...

  1前言大家都知道在Android开发中,一个好的Android架构能为项目带来极大的遍历,对于版本发布,后期维护等有着极为重要的地位,可以说架构是APP可持续发展的灵魂。在Android开发中也涌现出...

  几十亿的设备都在用Android系统,从高端手机到飞机上的影音娱乐系统,应有尽有,不一而足。而AndroidOS则为这几十亿的设备保驾护航,高效管理资源,保障运行流畅,然而有时候却增加了开发卓越App...

  概述android系统中的数据库SQLite使用起来并不方便,早期学习的时候一直很讨厌使用,后来出现了GreenDao、OrmLite、Realm极大的方便了android开发中的数据持久化。去年go...

  1前言前一篇博文已经初步的介绍了AndroidArchitectureComponents的基本概念以及基本使用,相信大家已经对这个组件有了一定的了解,这一篇博文主要来解析AndroidArchite...

  Android官方架构组件指南此指南适用于那些曾经或现在进行Android应用的基础开发,并希望了解和学习编写Android程序的最佳实践和架构。通过学习来构建强大的生产级别的应用。注意:此指南默认你...

  下面是官方提供的AndroidApp开发的架构图:从上图可以看到一些关键字:ViewModel,LiveData,Room等。其实看了上面视频的会发现Google官方Android架构组件一共包括以下...

  对象的内存分配从大方向上将,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB(转换后援...

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...

  前面既然写了中缀转后缀的,那么现在说下中缀转前缀的,至于后缀(前缀)转中缀,可以根据相关的转换规则自行转换。目的将中缀表达式(即标准的表达式)转换为前缀表达式例如:1+2*3+(4*5+6)7 转换成...

  独旅天涯关于SpringBoot bean无法注入的问题(与文件包位置有关)

  1.什么是MQTT协议MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。有可能成为物联网的重要组成部分。该协议支持所有...

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  网上查了一下工业视觉标定板,少则几百大洋,多则几千大洋,就想在A4纸上山寨打印一个标定图,就是黑白方格相间的那种。A4纸的标准大小为210*297mm。搞了个把小时,其实想明白了之后很简单。从每...

  eric_e的博客魔兽争霸3冰封王座1.24e 多开联机补丁 信息发布与收集点

  在MATLAB中,可以注释一段程序。 使用“%{”和“%}”。 例如 %{ 。。。 %} 即可。 经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 ...

  一、代理模式为某个对象提供一个代理,从而控制这个代理的访问。代理类和委托类具有共同的父类或父接口,这样在任何使用委托类对象的地方都可以使用代理类对象替代。代理类负责请求的预处理、过滤、将请求分配给委托...

  用CSS写背景图片,background-image:url(1.jpg); 但是一直都不显示图片,只有原本写好的div的边框。 一般不显示都是路径写错的问题,(图片的相对路径是指相对于写这条c...

本文链接:http://odigallery.com/qubiaojizujian/148.html