Android WorkManager使用入门
WorkManager使用入门
WorkManager
提供了任务调度功能,我们可以对工作进行标记或命名。
我们用一个示例来演示如何使用WorkManager。本文使用Kotlin。
入门示例
gradle引入依赖
将以下依赖项添加到应用模块的build.gradle文件中
dependencies {
def work_version = "2.5.0"
// (Java only)
implementation "androidx.work:work-runtime:$work_version"
// Kotlin + coroutines
implementation "androidx.work:work-runtime-ktx:$work_version"
// optional - RxJava2 support
implementation "androidx.work:work-rxjava2:$work_version"
// optional - GCMNetworkManager support
implementation "androidx.work:work-gcm:$work_version"
// optional - Test helpers
androidTestImplementation "androidx.work:work-testing:$work_version"
// optional - Multiprocess support
implementation "androidx.work:work-multiprocess:$work_version"
}
添加依赖项并同步 Gradle 后,下一步要定义一些工作。
定义工作
这里的工作为方便测试进行了简化。实际项目中请改为具体的业务代码。
新建UploadWorker
类继承Worker
类。需要2个参数context: Context, params: WorkerParameters
。
在doWork()
方法中是我们的具体任务,在WorkManager
提供的后台线程上异步运行。
class UploadWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
for (i in 1..3) {
Log.d(TAG, "模拟执行任务 ${tags.first()} ${Thread.currentThread()}")
Thread.sleep(100) // 模拟耗时
}
return Result.success()
}
}
doWork()
方法中我们打印当前线程信息。后面看看线程运行情况。
任务执行完毕,doWork()
需要返回一个Result
:
Result.success()
:工作成功完成Result.failure()
:工作失败Result.retry()
:工作失败,应根据其重试政策在其他时间尝试
创建 WorkRequest
前面我们定义好了工作类UploadWorker
。WorkManager
可以调度工作,让工作运行起来。工作可以在某个时间段内定期运行,也可以只运行一次。
要运行工作,涉及到WorkRequest
类和它的子类。
这里我们演示只运行1次的工作,使用OneTimeWorkRequest
。
创建workA
,作为一个Activity里的变量
private val mWorkA = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workA").build()
创建workB
val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workB").build()
将WorkRequest提交给WorkManager
使用enqueue
方法将WorkRequest提交给WorkManager。
获取WorkManager
的实例用WorkManager.getInstance(applicationContext)
方法。
mWorkA
是变量
WorkManager.getInstance(applicationContext).enqueue(mWorkA)
// ...
workB
是每次都新建一个对象,然后交给WorkManager
去执行。
val workB = OneTimeWorkRequest.Builder(UploadWorker::class.java)
.addTag("workB").build()
WorkManager.getInstance(applicationContext).enqueue(workB)
执行工作器的确切时间取决于WorkRequest
中使用的约束和系统优化方式。
Google官方设计过WorkManager
,能够在满足约束的情况下提供最佳行为。
运行测试
按钮A触发mWorkA
,按钮B触发workB
。分别点击按钮A/B
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
模拟执行任务 workA Thread[pool-2-thread-3,5,main]
点击按钮B Thread[main,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
模拟执行任务 workB Thread[pool-2-thread-1,5,main]
观察log发现,工作的doWork()
方法在WorkManager
提供的后台线程上异步运行。
主线程是[main,5,main]
,工作的线程是[pool-2-thread-3,5,main]
。
而在实际操作中发现,多次点击按钮A,mWorkA
只会执行第一次。后面再点击按钮A,mWorkA
也不会执行了。
小结
这个例子介绍了如何引入WorkManager
,定义工作(任务),排队执行任务。
在使用方式上,让人联想到AsyncTask。
其他参考
- Google 使用WorkManager调度任务 https://developer.android.com/topic/libraries/architecture/workmanager
- WorkManager使用入门 https://developer.android.com/topic/libraries/architecture/workmanager/basics
Android WorkManager使用入门的更多相关文章
- Android WorkManager 定时任务
App有时可能需要定期运行某些工作.例如,可能要定期备份数据.上传信息到服务器,定期获取新的内容等等. 在app运行期间,我们使用Handler也可以完成定期的功能.在这里我们介绍WorkManage ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- Android Studio单元测试入门
Android Studio单元测试入门 通常在开发Android app的时候经常会写一些小函数并验证它是否运行正确,通常做法我们是把这个函数放到某个界面(Activity上)执行一下,运行整个工程 ...
- 下面就介绍下Android NDK的入门学习过程(转)
为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库 ...
- Android渗透测试Android渗透测试入门教程大学霸
Android渗透测试Android渗透测试入门教程大学霸 第1章 Android渗透测试 Android是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能手机.平板等.目前 ...
- 一看就懂的Android APP开发入门教程
一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- Android Wear 开发入门
大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下An ...
- Android 学习资料入门到精通(PDF集合)共54本
最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4 游戏高级编程 ...
随机推荐
- MySQL 删除devices表中id最大的一行
原想法:delete from devices where id in (select max(id) from devices); 报错:ERROR 1093 (HY000): You can't ...
- SoapUI Pro 最新版本和最新功能
专为整个后端的端到端测试而构建 创建全面的端到端测试,以从API定义或实时端点验证API的整个工作流程.只需单击几下即可传递响应数据并添加断言-无需编码. 综合生成或配置数据 通过简单的数据驱动测试来 ...
- 不同版本docker修改存储位置补充
前言:最近发现yum安装docker,安装的版本不一样,有点蛇皮,虽然存放默认位置都是/var/lib/docker,但是它的配置文件不一样,这里做个补充 对于docker版本是1.13及以下 操作如 ...
- 重学 Spring Boot
什么是Spring Boot Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度和简化 Spring ...
- python 07篇 内置函数和匿名函数
一.内置函数 # 下面这些要掌握 # len type id print input open # round min max filter map zip exec eval print(all([ ...
- C语言:extern应用
前面我们都是将所有的代码写到一个源文件里面,对于小程序,代码不过几百行,这或许无可厚非,但当程序膨胀代码到几千行甚至上万行后,就应该考虑将代码分散到多个文件中,否则代码的阅读和维护将成为一件痛苦的事情 ...
- hadoop源码_hdfs启动流程_3_心跳机制
hadoop在启动namenode和datanode之后,两者之间是如何联动了?datanode如何向namenode注册?如何汇报数据?namenode又如何向datanode发送命令? 心跳机制基 ...
- Python Unittest简明教程
1 概述 单元测试框架是一种软件测试方法,通过来测试源代码中的各个单元,例如类,方法等,以确定它们是否符合要求.直观上来说,可以将单元视为最小的可测试部分.单元测试是程序员在开发过程中创建的短代码片段 ...
- vue3.0使用ant-design-vue进行按需加载原来这么简单
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...
- odoo14里面的log模块
日志记录是分析 Odoo 服务器运行服务时发生的操作的最重要工具之一.此外,在大多数情况下,通过分析服务器日志,我们可以清楚地了解错误或存在的任何错误. 最初,如果我们想使用日志记录选项,我们需要从 ...