Last active
November 21, 2019 08:44
-
-
Save jixiaoyong/041d8b0775e392302b4cd57a98b4f6fa to your computer and use it in GitHub Desktop.
Jetpack-WorkManager
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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