其中uploadPhoto是执行在后台线程的,返回值可以是成功或者失败,还可以是重试,这意味着告诉系统这个任务需要后面找机会重新执行。有了上面那些基础,接下去就只需要利用Worker创建对应的WorkRequest,并并添加到WorkManager的执行队列中就好了。
正常情况下,放到任务队列中的任务会被立马执行,可是如果遇到网络连接失败的情况,这样就会执行失败。此时我们就可以通过添加限定执行条件来达到优化的目的,例如设置限定只在网络连接成功的时候才进行任务的执行。
有了上面的任务触发逻辑之后,那么如何做任务的监听呢?例如正在处理过程中显示一个进度圈,处理成功的时候消失进度等等。我们可以使用如下演示的范例来监听任务的执行状态。
LiveData
是Google开发的一个感知生命周期的架构组件。使用这个组件来hook监听request任务的WorkStatus
。在WorkStatus里面有任务的id和status,其中status有6种状态,分别是ENQUEUED
,RUNNING
,SUCCEEDED
,FAILED
,BLOCKED
,CANCELLED
。
通常来说,上传任务真正被执行之前,我们会对数据做一次压缩,因为每一个任务都需要在后台进行,并且需要保证执行顺序。我们可以使用下面的示例方式,先进行压缩,成功之后,再进行上传。
只所以可以类似上面那样写,是因为每一步任务返回的都是WorkContinuation
,使用它可以对不同的任务进行串联。
如果想要多项任务并发执行,可以同时建立多个WorkRequest,一起交给WorkManager进行执行(根据CPU核心数和架构的不同,并发数量有所差异)。
我们再把任务链设置的更加复杂一点,例如图片要先分别经过不同的滤镜处理,之后再进行压缩,最后才可以上传,那么使用WorkManager该如何实行呢?
任务之间如何进行数据的传递呢?在介绍这个之前,我们需要了解下什么叫做MapReduce。例如,我们想要从三本书里面找出使用最多的词语,先把所有词语都进行计算一遍,然后对词语的使用次数进行排序,最后才可以找出使用最多的词语,我们把这个行为叫做MapReduce。
使用WorkManager的输入和输出数据具备如下的特点:
-
简单的KEY-VALUE
-
KEY都是String类型的
-
VALUE可以是基础数据类型和String
-
数据本身已经做了序列化处理
-
限定10KB大小以内
我们使用如下的方式进行输入的数据传递,构造一个map类型的Data,通过WorkManager的setInputData()
给Worker进行传输数据。
接下去Worker可以通过getInputData()
来获取到输入的数据。
一般来说,我们会需要把处理的结果进行返回,那么使用setOutputData()
来完成这个操作就可以了
有意思的事情是,在任务链中,输出的数据一般就是下一个任务的输入。那么当某个环节的一个任务是由多个任务的输出构成的时候,改如何处理呢?
为了解决这个问题,我们需要了解InputMergers
,顾名思义,它是用来合并多个输入数据变成一个的。一般来说有两种合并实现的方式(也可以自己自定义)
OverwritingInputMerger
(系统默认):按照输入数据的先后顺序,相同KEY会被覆盖,不同的KEY内容会被保留
ArrayCreatingInputMerger
:相同KEY的VALUE值进行合并,需要确保VALUE是相同数据类型的,否者会出现异常
想要取消一个任务,只需要调用cancelWorkById()
就好了,但是需要注意的是,这个方法只是尽力而为,因为相关想要取消的任务有可能已经在运行,也有可能已经执行结束了。
前面我们有提到过好几次任务id,这个id是系统自动生成的,类似UUID这样的数值。我们无法通过这个id来判断这是一个什么样的任务,tags就是为了解决这个任务可读性的问题的。我们可以给任务打上一个或者多个tag来标记这是一个什么样的任务,然后可以通过这个tag来查询,取消任务等等。
使用Tag可以给我们提供很大的帮助,我们可以根据不同的模块和依赖给任务设置不同的tag,也可以根据任务的类型进行设置tag,这样就可以方便的进行批量任务操作了。
为了解决多个任务的同步问题,引入了Unique Work的机制。它有三种类型,分别为
KEEP
:新启动的Unique任务,如果之前已经存在,就继续保留旧的任务,如果不存在,则触发这次新的任务
REPLACE
:取消或者删除之前的所有此类Unique任务,使用这次的任务作为最新任务,重复调用多次的时候,会以最后一次为准
APPEND
:按照添加顺序,逐个执行任务
重复任务和我们之前认知的其他重复任务一样,具备一些如下的特点:
-
最短间隔时间15分钟(和JobScheduler一样)
-
同样受系统doze mode和其他的后台任务限制
-
不可以有任务链
-
不可以有触发延迟
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/1dc03d720afcb415d9214b05579f6820.jpeg)
最后
上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。
也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。
我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料。
部分文件:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
爱一起整理的Android时下热门知识点的学习资料**。
部分文件:
[外链图片转存中…(img-HfmRs2gW-1712505913062)]
[外链图片转存中…(img-oEkSo02q-1712505913062)]
[外链图片转存中…(img-jOT3mBg3-1712505913062)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!