Skip to content

Instantly share code, notes, and snippets.

@jixiaoyong
Last active November 21, 2019 08:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jixiaoyong/041d8b0775e392302b4cd57a98b4f6fa to your computer and use it in GitHub Desktop.
Save jixiaoyong/041d8b0775e392302b4cd57a98b4f6fa to your computer and use it in GitHub Desktop.
Jetpack-WorkManager
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.work.*
/**
* Created by jixiaoyong1995@gmail.com
* Data: 2019/11/21.
* Description: WorkManager使用示例
*
* 参考链接:
* https://medium.com/androiddevelopers/workmanager-basics-beba51e94048
* http://hukai.me/google-io-2018-android-jetpack-workmanager/
*
* 需要先添加依赖:
* implementation "android.arch.work:work-runtime-ktx:$work_version"
*
*/
class JetPackWorkManager {
private val observer: Observer<WorkInfo> = Observer {
//这里传来的是downloadWorkRequest任务的状态信息
it.state //状态
it.outputData //数据
}
private var downloaderWatcher: LiveData<WorkInfo>? = null
fun start() {
/**
* 这里使用到了[Data] ( Data, which is essentially a map of primitive types and arrays.)
* 用来在Worker间传递基本类型的数据及由其组成的数组
* 有大小限制(10KB)
*/
val data = Data.Builder()
.putString("KEY1", "在构建任务的时候传入Data")
.putInt("KEY1", 1)
.build()
/**
* 约束
* 只有当约束指定的条件满足时,才会执行对应的任务
* 当[Worker]返回值为[Result.retry()]时,会根据约束判断是否重试
*/
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
/**
* WorkRequest defines how and when work should be run.
*/
val downloadWorkRequest = OneTimeWorkRequestBuilder<DownloadWorker>()
.setInputData(data)
.setConstraints(constraints)
.build()
val saveWorkRequest = OneTimeWorkRequestBuilder<SaveWorker>()
.build()
//24小时循环一次
// val saveWorkPeriodicRequest = PeriodicWorkRequestBuilder<SaveWorker>(
// Duration.ofHours(24L)
// ).build()
// WorkManager.getInstance().enqueue(saveWorkPeriodicRequest)
/**
* Running work
* 1.子线程 2.保证得到执行 3.根据API选择具体实现
* 内部实现:
* Internal TaskExecutor 管理enqueue到WorkManager的WorkRequest
* WorkManager database 保存Worker的信息和状态,保证在设备重启等情况下仍然可以读取到任务信息
* WorkerFactory 创建Worker实例
* Default Executor 管理并保证任务在子线程运行
*/
WorkManager.getInstance()
.beginWith(downloadWorkRequest)
.then(saveWorkRequest)
.enqueue()
downloaderWatcher =
WorkManager.getInstance().getWorkInfoByIdLiveData(downloadWorkRequest.id)
downloaderWatcher?.observeForever(observer)
}
class DownloadWorker(context: Context, workerParameters: WorkerParameters) :
Worker(context, workerParameters) {
private val inData = inputData.getString("KEY1")// "在构建任务的时候传入Data"
override fun doWork(): Result {
//do work
val outData = Data.Builder()
.putString("KEY2", "传给外部/下游worker的值(beginWith-then关系中)")
.build()
return Result.success(outData)
}
}
class SaveWorker(context: Context, workerParameters: WorkerParameters) :
Worker(context, workerParameters) {
private val inData = inputData.getString("KEY2")// "传给外部/下游worker的值(beginWith-then关系中)"
override fun doWork(): Result {
//do work
val outData = Data.Builder().putAll(inputData).build()
return Result.success(outData)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment