Android学习Android Jetpack

探索Jetpack:使用WorkManager调度任务

2018-05-29  本文已影响1157人  小菜鸟程序媛

原文地址:https://android.jlelse.eu/exploring-jetpack-scheduling-tasks-with-work-manager-fba20d7c69bf

18年I/O大会,google发布了 Android Jetpack.它是一些列的库,工具和架构指南,可以帮助你轻松快速的构建以优秀的App。在Android Jetpack中,Google团队中发布了一个专门用于调度和管理后台任务的库,它被称为WorkManager。

在这部分中,你将了解调度程序的演变,什么是工作管理器,如何使用它以及何时使用。在西一部分,你将了解如何连接所有的任务并且有序的执行。

你可能会说,我们在Android操作系统内部安排了Job Scheduler API来调度任务。我们还有GCM网络管理员,Firebase Job Dispatcher,Evernote的Android Job以及许多其他库,可以调度后台任务。为什么我们需要另一个新库来调度任务?

为了回答这个任务,我相处了后台任务调度器进化矩阵,将此视为时间便的四大支柱

image.png
让我们一个一个开始讨论:
1. 易于调度

易于取消

易于查询

支持所有的Android版本

让我们根据上面的标准来评估WorkManager。

WorkManager API的不同之处

根据官方文档
1. 易于调度

2. 易于取消
WorkManager给每个任务分配了UUID,使用这个唯一的ID你就可以随时取消任务。

3.易于查询

4.支持Android所有版本

image.png

类和概念

Work manager APIs建立在几个类上,你必须继承一些抽象类来安排任务。

工作流程

让我们了解如何创建和安排新的work

1.创建work

class DownloadWorker : Worker() {

    // Define the parameter keys:
    private val KEY_X_ARG = "X"
    private val KEY_Y_ARG = "Y"
    private val KEY_Z_ARG = "Z"

    // The result key:
    private val KEY_RESULT = "result"

    /**
     * This will be called whenever work manager run the work.
     */
    override fun doWork(): WorkerResult {
        // Fetch the arguments (and specify default values):
        val x = inputData.getLong(KEY_X_ARG, 0)
        val y = inputData.getLong(KEY_Y_ARG, 0)
        val z = inputData.getLong(KEY_Z_ARG, 0)

        val timeToSleep = x  + y + z
        Thread.sleep(timeToSleep)

        //...set the output, and we're done!
        val output = Data.Builder()
                .putInt(KEY_RESULT, timeToSleep.toInt())
                .build()

        outputData = output
        // Indicate success or failure with your return value.
        return WorkerResult.SUCCESS
    }
}

2.定义约束

val myConstraints = Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        .build()

3.创建work request

val request = OneTimeWorkRequest.Builder(DownloadWorker::class.java)
     .setConstraints(myConstraints)
     .build()
val request = PeriodicWorkRequest
         .Builder(DownloadWorker::class.java, 1, TimeUnit.HOURS)
         .setConstraints(myConstraints)
         .build()

4.执行请求

WorkManager.getInstance().enqueue(request)
image.png

输入参数和返回值:

设置输入参数

val myData = Data.Builder()
        .putLong(KEY_X_ARG, 42)
        .putLong(KEY_Y_ARG, 421)
        .putLong(KEY_Z_ARG, 8675309)
        .build()
val request = OneTimeWorkRequest.Builder(DownloadWorker::class.java)
        .setInputData(myData)
        .build()

你可以通过调用getInputData来读取所有这些输入参数,执行完任务后,可以调用setOutputData为该worker设置输出数据。

class DownloadWorker : Worker() {

    // Define the parameter keys:
    private val KEY_X_ARG = "X"
    private val KEY_Y_ARG = "Y"
    private val KEY_Z_ARG = "Z"

    // The result key:
    private val KEY_RESULT = "result"

    /**
     * This will be called whenever work manager run the work.
     */
    override fun doWork(): WorkerResult {
        // Fetch the arguments (and specify default values):
        val x = inputData.getLong(KEY_X_ARG, 0)
        val y = inputData.getLong(KEY_Y_ARG, 0)
        val z = inputData.getLong(KEY_Z_ARG, 0)

        val timeToSleep = x  + y + z
        Thread.sleep(timeToSleep)

        //...set the output, and we're done!
        val output = Data.Builder()
                .putInt(KEY_RESULT, timeToSleep.toInt())
                .build()

        outputData = output
        // Indicate success or failure with your return value.
        return WorkerResult.SUCCESS
    }
}

观察输出数据

什么时候使用work manager?

你可能会觉得work manager APIs使用起来如此简单,如果我们使用它来运行我的所有后台任务,该怎么办?请学习下一篇。

上一篇 下一篇

猜你喜欢

热点阅读