Architecture -- WorkManager
1. WorkManager
1). 简介
其实就是"管理一些要在后台工作的任务, -- 即使你的应用没启动也能保证任务能被执行",WorkManager在底层, 会根据你的设备情况, 选用JobScheduler, Firebase的JobDispatcher, 或是AlarmManager。WorkManager并不是为了那种在应用内的后台线程而设计出来的. 这种需求你应该使用ThreadPool。
2). 引入
- kolin
# Android Studio 3.0, 3.0以下版本请使用complie ext.work_version = "1.0.0-alpha02" // WorkManager implementation "android.arch.work:work-runtime:$work_version" // use -ktx for Kotlin // optional - Firebase JobDispatcher support implementation "android.arch.work:work-firebase:$work_version" // optional - Test helpers androidTestImplementation "android.arch.work:work-testing:$work_version"
- java
# 必须加入 implementation "android.arch.work:work-runtime:1.0.0-alpha01"
2. 用法
1). 执行一次的任务
- PullWorker.kt
/** * Pull 任务 * 创建步骤: * 1. 继承Worker类 * 2. 重写doWork()方法 * Created by mazaiting on 2018/6/6. */ class PullWorker : Worker() { override fun doWork(): WorkerResult { // 模拟设置页面中的"是否接受推送"是否被勾选 val isOkay = this.inputData.getBoolean("key_accept_bg_work", false) // 判断是否推送 if (isOkay) { // 模拟长时间工作 Thread.sleep(5000) // 获取数据 val pulledResult = startPull() // 设置输出数据 val output = Data.Builder().putString("key_pulled_result", pulledResult).build() // 存放数据 outputData = output // 返回成功 return WorkerResult.SUCCESS } else { // 返回失败 return WorkerResult.FAILURE } } /** * 开始推送 */ private fun startPull(): String { return "[worker] pull messages from backend." } }
- PullEngine.kt
/** * Pull 引擎 * Created by mazaiting on 2018/6/6. */ class PullEngine { fun scheduleOneTimeWork(context: Context) { // 设置任务,执行一次 val pullRequest = OneTimeWorkRequestBuilder<PullWorker>() .setInputData( Data.Builder() .putBoolean("key_accept_bg_work", true) .build() ) .build() WorkManager.getInstance().enqueue(pullRequest) // 将请求入列 WorkManager.getInstance().enqueue(pullRequest) // 获取请求ID val pullRequestId = pullRequest.id // 存在SharedPreference中 PreferenceManager .getDefaultSharedPreferences(context) .edit() .putString("pullId", pullRequestId.toString()) .apply() } }
- MainApplication.kt(注意在AndroidManifest.xml文件中配置)
class MainApplication : Application() { override fun onCreate() { super.onCreate() // 任务执行一次 PullEngine().scheduleOneTimeWork(this.applicationContext) } }
- MainActivity.kt
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // UUID实现了Serializable接口,能由toString(),fromString()与String互转 val uuid = UUID.fromString( PreferenceManager.getDefaultSharedPreferences(this.applicationContext) .getString("pullId", "") ) WorkManager.getInstance() // 获取状态ID .getStatusById(uuid) // 观察数据 .observe(this, Observer<WorkStatus>{ status -> if (null != status && status.state.isFinished) { val pulledResult = status.outputData.getString("key_pulled_result","") Log.e("MainActivity", pulledResult) } }) } }
-
打印结果
图1.png
2). 任务设置约束
fun scheduleOneTimeWork(context: Context) { val constraints = Constraints.Builder() // 负荷 .setRequiresCharging(true) .build() // 设置任务,执行一次 val pullRequest = OneTimeWorkRequestBuilder<PullWorker>() // 设置约束 .setConstraints(constraints) // 输入数据 .setInputData( Data.Builder() .putBoolean("key_accept_bg_work", true) .build() ) .build() // 将请求入列 WorkManager.getInstance().enqueue(pullRequest) // 获取请求ID val pullRequestId = pullRequest.id // 存在SharedPreference中 PreferenceManager .getDefaultSharedPreferences(context) .edit() .putString("pullId", pullRequestId.toString()) .apply() }
3). 取消任务
// 获取请求ID val pullRequestId = pullRequest.id // 取消任务 WorkManager.getInstance().cancelWorkById(pullRequestId)
4). 任务链
WorkManager.getInstance() .beginWith(workA) // Note: WorkManager.beginWith() returns a // WorkContinuation object; the following calls are // to WorkContinuation methods .then(workB) // FYI, then() returns a new WorkContinuation instance .then(workC) .enqueue()
或
WorkManager.getInstance() // First, run all the A tasks (in parallel): .beginWith(workA1, workA2, workA3) // ...when all A tasks are finished, run the single B task: .then(workB) // ...then run the C tasks (in any order): .then(workC1, workC2) .enqueue()
再或
val chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB) val chain2 = WorkManager.getInstance() .beginWith(workC) .then(workD) val chain3 = WorkContinuation .combine(chain1, chain2) .then(workE) chain3.enqueue()
5). 定时任务
/** * 执行任务 */ fun schedulePeriodicWork(context: Context) { val constraints = Constraints.Builder() // 负荷 .setRequiresCharging(true) .build() // 设置任务执行时长,并设置输入参数 // 长期任务,循环 val pullRequest = PeriodicWorkRequestBuilder<PullWorker>(30, TimeUnit.SECONDS) .setConstraints(constraints) .setInputData( Data.Builder() .putBoolean("key_accept_bg_work", true) .build() ) .build() // 将请求入列 WorkManager.getInstance().enqueue(pullRequest) // 获取请求ID val pullRequestId = pullRequest.id // 存在SharedPreference中 PreferenceManager .getDefaultSharedPreferences(context) .edit() .putString("pullId", pullRequestId.toString()) .apply() }
6). 原文地址
7). 代码下载

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案
Android NestedScrollView嵌套RecyclerView滑动卡顿问题简洁解决方案 其实仅仅需要给RecyclerView加一行控制代码即可: mRecyclerView.setNestedScrollingEnabled(false);这是最简洁的解决方案 过去网上也给出了其他的解决方法,比如是这样: mLinearLayoutManager.setSmoothScrollbarEnabled(true); mRecyclerView.setNestedScrollingEnabled(false);但是实际上如果开发者再次给RecyclerView的布局控制器mLinearLayoutManager设置setSmoothScrollbarEnabled为true是多余的,因为在LinearLayoutManager的内部源代码中,默认的setSmoothScrollbarEnabled就是true,看LinearLayoutManager内部实现的源代码关键片段: /** * Works the same way as {@link android.widget....
- 下一篇
Xamarin.Android 使用ListView绑定数据
使用ListView进行数据绑定 第一步:新建一个类,用于存储显示字段。 namespace ListViewDataBIndDemo { public class Person { public int Id { get; set; } public string Name { get; set; } public string IdCard { get; set; } public string Sex { get; set; } public string Age { get; set; } } } 第二步:在Mian.axml中绘制界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7