-
官方文档
https://developer.android.com/topic/libraries/architecture/workmanager -
引用方法
使用androidx,需要考虑com.android.support的兼容问题。需要替换最新的androidx兼容包。
一键迁移AndroidX库:选择菜单上的ReFactor —— Migrate to AndroidX... 即可
def work_version = "2.2.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"
- 概述
Workmanager是JetPack的一部分,用来进行任务管理,异步处理,可以设置各种条件下执行,例如电池,内存等。可以在应用重启或者手机重启后重新开始执行。
网络链接变化时执行,电量足够时执行,闲置时执行。 - 有两种任务类型,一种是周期执行,一种是执行一次
var constraint = Constraints.Builder()
.setRequiresCharging(true)
.build()
var repeatRequest = PeriodicWorkRequest.Builder(MyWorker::class.java,1,TimeUnit.SECONDS)
.setConstraints(constraint)
.build()
WorkManager.getInstance(this).enqueue(repeatRequest)
var data = Data.Builder()//最大10kb
.putString("string", "myString")
.build()
var oneTimeWorkRequest = OneTimeWorkRequest.Builder(DataWorker::class.java)
.setInputData(data)
.addTag("cleanUP")//增加tag,用来找到
.build()
WorkManager.getInstance(this).enqueue(oneTimeWorkRequest)
- 可以设置限制执行条件,可以设置延迟时间,可以设置重试机制,可以设置输入输出数据,可以为Work设置tag
val cacheCleanupTask =
OneTimeWorkRequestBuilder<CacheCleanupWorker>()
.setConstraints(constraints)
.addTag("cleanup")
.build()
val uploadWorkRequest = OneTimeWorkRequestBuilder<UploadWorker>()
.setBackoffCriteria(
BackoffPolicy.LINEAR,
OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
TimeUnit.MILLISECONDS)
.build()
- 可以得到任务执行的状态
stop时,任务的后续处理。stop时work还会继续执行
WorkManager.getInstance(myContext).getWorkInfoByIdLiveData(uploadWorkRequest.id)
.observe(lifecycleOwner, Observer { workInfo ->
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
displayMessage("Work finished!")
}
})
- 任务链执行
一个父任务失败或者取消,后面的任务不再执行
WorkManager.getInstance(myContext)
// Candidates to run in parallel
.beginWith(listOf(filter1, filter2, filter3))
// Dependent work (only runs after all previous work in chain)
.then(compress)
.then(upload)
// Don't forget to enqueue()
.enqueue()
- unitWork
独有任务,开启任务时,设备唯一名称,重复任务将有很多执行状态,可以设置各种Policy,增加,还是取消,还是替换 - 可以自定义Work的配置
首先移除默认的初始化方法
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
然后增加自己的配置方法
可以配置线程池等信息
class myApplication() : Application(), Configuration.Provider {
override getWorkManagerConfiguration() =
Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.build()
}
网友评论