Android Jetpack - 使用WorkManager处理简单的后台任务

google_io_2018_android_jetpack_workmanager_03

google_io_2018_android_jetpack_workmanager_04

其中uploadPhoto是执行在后台线程的,返回值可以是成功或者失败,还可以是重试,这意味着告诉系统这个任务需要后面找机会重新执行。有了上面那些基础,接下去就只需要利用Worker创建对应的WorkRequest,并并添加到WorkManager的执行队列中就好了。

google_io_2018_android_jetpack_workmanager_05

正常情况下,放到任务队列中的任务会被立马执行,可是如果遇到网络连接失败的情况,这样就会执行失败。此时我们就可以通过添加限定执行条件来达到优化的目的,例如设置限定只在网络连接成功的时候才进行任务的执行。

google_io_2018_android_jetpack_workmanager_06

2)Observing Work


有了上面的任务触发逻辑之后,那么如何做任务的监听呢?例如正在处理过程中显示一个进度圈,处理成功的时候消失进度等等。我们可以使用如下演示的范例来监听任务的执行状态。

google_io_2018_android_jetpack_workmanager_07

LiveData是Google开发的一个感知生命周期的架构组件。使用这个组件来hook监听request任务的WorkStatus。在WorkStatus里面有任务的id和status,其中status有6种状态,分别是ENQUEUED,RUNNING,SUCCEEDED,FAILED,BLOCKED,CANCELLED

3)Chaining Work


通常来说,上传任务真正被执行之前,我们会对数据做一次压缩,因为每一个任务都需要在后台进行,并且需要保证执行顺序。我们可以使用下面的示例方式,先进行压缩,成功之后,再进行上传。

google_io_2018_android_jetpack_workmanager_08

只所以可以类似上面那样写,是因为每一步任务返回的都是WorkContinuation,使用它可以对不同的任务进行串联。

google_io_2018_android_jetpack_workmanager_09

如果想要多项任务并发执行,可以同时建立多个WorkRequest,一起交给WorkManager进行执行(根据CPU核心数和架构的不同,并发数量有所差异)。

google_io_2018_android_jetpack_workmanager_10

我们再把任务链设置的更加复杂一点,例如图片要先分别经过不同的滤镜处理,之后再进行压缩,最后才可以上传,那么使用WorkManager该如何实行呢?

google_io_2018_android_jetpack_workmanager_11

4)Inputs and Outputs


任务之间如何进行数据的传递呢?在介绍这个之前,我们需要了解下什么叫做MapReduce。例如,我们想要从三本书里面找出使用最多的词语,先把所有词语都进行计算一遍,然后对词语的使用次数进行排序,最后才可以找出使用最多的词语,我们把这个行为叫做MapReduce。

使用WorkManager的输入和输出数据具备如下的特点:

  • 简单的KEY-VALUE

  • KEY都是String类型的

  • VALUE可以是基础数据类型和String

  • 数据本身已经做了序列化处理

  • 限定10KB大小以内

我们使用如下的方式进行输入的数据传递,构造一个map类型的Data,通过WorkManager的setInputData()给Worker进行传输数据。

google_io_2018_android_jetpack_workmanager_12

接下去Worker可以通过getInputData()来获取到输入的数据。

google_io_2018_android_jetpack_workmanager_13

一般来说,我们会需要把处理的结果进行返回,那么使用setOutputData()来完成这个操作就可以了

google_io_2018_android_jetpack_workmanager_14

有意思的事情是,在任务链中,输出的数据一般就是下一个任务的输入。那么当某个环节的一个任务是由多个任务的输出构成的时候,改如何处理呢?

google_io_2018_android_jetpack_workmanager_15

为了解决这个问题,我们需要了解InputMergers,顾名思义,它是用来合并多个输入数据变成一个的。一般来说有两种合并实现的方式(也可以自己自定义)

  • OverwritingInputMerger(系统默认):按照输入数据的先后顺序,相同KEY会被覆盖,不同的KEY内容会被保留

google_io_2018_android_jetpack_workmanager_16

  • ArrayCreatingInputMerger:相同KEY的VALUE值进行合并,需要确保VALUE是相同数据类型的,否者会出现异常

google_io_2018_android_jetpack_workmanager_17

5)Cancelling Work


想要取消一个任务,只需要调用cancelWorkById()就好了,但是需要注意的是,这个方法只是尽力而为,因为相关想要取消的任务有可能已经在运行,也有可能已经执行结束了。

google_io_2018_android_jetpack_workmanager_18

6)Tags


前面我们有提到过好几次任务id,这个id是系统自动生成的,类似UUID这样的数值。我们无法通过这个id来判断这是一个什么样的任务,tags就是为了解决这个任务可读性的问题的。我们可以给任务打上一个或者多个tag来标记这是一个什么样的任务,然后可以通过这个tag来查询,取消任务等等。

google_io_2018_android_jetpack_workmanager_19

google_io_2018_android_jetpack_workmanager_20

使用Tag可以给我们提供很大的帮助,我们可以根据不同的模块和依赖给任务设置不同的tag,也可以根据任务的类型进行设置tag,这样就可以方便的进行批量任务操作了。

7)Unique Work


为了解决多个任务的同步问题,引入了Unique Work的机制。它有三种类型,分别为

  • KEEP:新启动的Unique任务,如果之前已经存在,就继续保留旧的任务,如果不存在,则触发这次新的任务

google_io_2018_android_jetpack_workmanager_21

  • REPLACE:取消或者删除之前的所有此类Unique任务,使用这次的任务作为最新任务,重复调用多次的时候,会以最后一次为准

google_io_2018_android_jetpack_workmanager_22

  • APPEND:按照添加顺序,逐个执行任务

google_io_2018_android_jetpack_workmanager_23

8)Periodic Work


重复任务和我们之前认知的其他重复任务一样,具备一些如下的特点:

  • 最短间隔时间15分钟(和JobScheduler一样)

  • 同样受系统doze mode和其他的后台任务限制

  • 不可以有任务链

  • 不可以有触发延迟

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:


《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

爱一起整理的Android时下热门知识点的学习资料**。

部分文件:
[外链图片转存中…(img-HfmRs2gW-1712505913062)]
[外链图片转存中…(img-oEkSo02q-1712505913062)]
[外链图片转存中…(img-jOT3mBg3-1712505913062)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在项目中引入WorkManager库: ``` implementation 'androidx.work:work-runtime:2.4.0' ``` 然后,创建一个Worker类实现文件拷贝的任务。在doWork()方法中执行拷贝任务,并使用setProgressAsync()方法设置进度: ``` public class FileCopyWorker extends Worker { private static final String TAG = "FileCopyWorker"; public FileCopyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { String[] filesToCopy = getInputData().getStringArray("files_to_copy"); String usbDrivePath = getInputData().getString("usb_drive_path"); if (filesToCopy == null || usbDrivePath == null) { Log.e(TAG, "Invalid input data"); return Result.failure(); } int totalFiles = filesToCopy.length; int filesCopied = 0; for (String fileToCopy : filesToCopy) { // Copy fileToCopy to usbDrivePath // ... filesCopied++; setProgressAsync(new Data.Builder().putInt("progress", (int) (filesCopied * 100.0f / totalFiles)).build()); } return Result.success(); } } ``` 接下来,在Activity中创建WorkRequest并提交任务: ``` // Create WorkRequest Data inputData = new Data.Builder() .putStringArray("files_to_copy", new String[] {"/path/to/file1", "/path/to/file2"}) .putString("usb_drive_path", "/mnt/usb") .build(); OneTimeWorkRequest fileCopyRequest = new OneTimeWorkRequest.Builder(FileCopyWorker.class) .setInputData(inputData) .build(); // Submit WorkRequest WorkManager.getInstance(context).enqueue(fileCopyRequest); ``` 最后,在Activity中监听任务进度并更新UI: ``` WorkManager.getInstance(context).getWorkInfoByIdLiveData(fileCopyRequest.getId()) .observe(this, workInfo -> { if (workInfo != null && workInfo.getState() == WorkInfo.State.RUNNING) { int progress = workInfo.getProgress().getInt("progress", 0); progressBar.setProgress(progress); } }); ``` 以上是一个简单的示例,可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值