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条评论来说两句吧...