美文网首页
WorkManager (4) —— 参数传递

WorkManager (4) —— 参数传递

作者: 王可大虾 | 来源:发表于2021-01-27 15:35 被阅读0次

单次任务和周期任务的创建和执行,现在已经清楚了。但是有问题,之前创建的Worker就是一个单纯的Worker,和任务添加者是没有关系的,如果需要传递参数,应该怎么做?

WorkRequest.Builder.setInputData(Data)就是我们要找的东西。

Data

参数传递使用了一个叫Data的类

/**
 * A persistable set of key/value pairs which are used as inputs and outputs for
 * {@link ListenableWorker}s.  Keys are Strings, and values can be Strings, primitive types, or
 * their array variants.
 * <p>
 * This is a lightweight container, and should not be considered your data store.  As such, there is
 * an enforced {@link #MAX_DATA_BYTES} limit on the serialized (byte array) size of the payloads.
 * This class will throw {@link IllegalStateException}s if you try to serialize or deserialize past
 * this limit.
 */

public final class Data {
    // .....
    public static final class Builder {
    // .....
    }
}

Data是一个轻量级的键值对数据类,键为String,值可以是String原始类型以及它们的数组。如果是其他类型,就会有异常。

从下面代码就能看出:

public @NonNull Builder put(@NonNull String key, @Nullable Object value) {
    if (value == null) {
        mValues.put(key, null);
    } else {
        Class<?> valueType = value.getClass();
        if (valueType == Boolean.class
                || valueType == Byte.class
                || valueType == Integer.class
                || valueType == Long.class
                || valueType == Float.class
                || valueType == Double.class
                || valueType == String.class
                || valueType == Boolean[].class
                || valueType == Byte[].class
                || valueType == Integer[].class
                || valueType == Long[].class
                || valueType == Float[].class
                || valueType == Double[].class
                || valueType == String[].class) {
            mValues.put(key, value);
        } else if (valueType == boolean[].class) {
            mValues.put(key, convertPrimitiveBooleanArray((boolean[]) value));
        } else if (valueType == byte[].class) {
            mValues.put(key, convertPrimitiveByteArray((byte[]) value));
        } else if (valueType == int[].class) {
            mValues.put(key, convertPrimitiveIntArray((int[]) value));
        } else if (valueType == long[].class) {
            mValues.put(key, convertPrimitiveLongArray((long[]) value));
        } else if (valueType == float[].class) {
            mValues.put(key, convertPrimitiveFloatArray((float[]) value));
        } else if (valueType == double[].class) {
            mValues.put(key, convertPrimitiveDoubleArray((double[]) value));
        } else {
            throw new IllegalArgumentException(
                    String.format("Key %s has invalid type %s", key, valueType));
        }
    }
    return this;
}

而且传递的数据大小也有限制,最大为MAX_DATA_BYTES(10K)

参数传递

有了Data的知识,现在就传递一个名称给DelayWorker,作为一个描述字符串。

读取

DelayWorker新增一个名称参数,并在任务里面读取并打印出来

class DelayWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    override fun doWork(): Result {
        val name = inputData.getString(ARG_NAME) // 获取名称,并在日志里打印出来
        Log.d(TAG, "[$name] doWork on ${Thread.currentThread().id} started - ${System.currentTimeMillis()}  -> $id")
        // emulated work
        Thread.sleep(3000)
        Log.d(TAG, "[$name] doWork on ${Thread.currentThread().id} ended - ${System.currentTimeMillis()}")
        return Result.success()
    }

    companion object {
        const val ARG_NAME = "name" // 名称参数
    }
}

写入

如前文所说,写入参数当然使用Worker.Builder的方法:

val request = OneTimeWorkRequestBuilder<DelayWorker>()
    .setInputData(
        Data.Builder()
            .putString(DelayWorker.ARG_NAME, "ONE-TIME")
            .build()
    )
    .build()

执行结果:

2021-01-14 10:01:34.920 12531-12531/com.jacee.examples.workmanager D/JTest: enqueue on 2 1610589694920
2021-01-14 10:01:34.961 12531-12570/com.jacee.examples.workmanager D/JTest: [ONE-TIME] doWork on 7172 started - 1610589694961  -> 8aa7a2ee-af7f-47ad-9f17-b898268dd487
2021-01-14 10:01:34.962 12531-12531/com.jacee.examples.workmanager D/JTest: onetime: 8aa7a2ee-af7f-47ad-9f17-b898268dd487: ENQUEUED
2021-01-14 10:01:34.966 12531-12531/com.jacee.examples.workmanager D/JTest: onetime: 8aa7a2ee-af7f-47ad-9f17-b898268dd487: RUNNING
2021-01-14 10:01:37.965 12531-12570/com.jacee.examples.workmanager D/JTest: [ONE-TIME] doWork on 7172 ended - 1610589697965
2021-01-14 10:01:38.024 12531-12531/com.jacee.examples.workmanager D/JTest: onetime: 8aa7a2ee-af7f-47ad-9f17-b898268dd487: SUCCEEDED

成功实现名称传递。

小结

今天的内容很简单,但又很重要 —— 带参的任务,一定不会是个低概率需求。

本文首发于 https://jaceedai.github.io/

相关文章

  • WorkManager (4) —— 参数传递

    单次任务和周期任务的创建和执行,现在已经清楚了。但是有问题,之前创建的Worker就是一个单纯的Worker,和任...

  • 函数之参数类型

    1.位置参数 2.默认参数 3.指定参数名赋值传递参数 4.动态函数

  • 4、flask服务 -- 参数传递及校验

    flask参数传递及参数校验: Script Demo: config.py app_4.py proj_dir/...

  • Ajax传递不同类型的参数

    1、目录结构: 1.传递普通的参数 2.传递对象 3.传递List 4.传递数组 1.1 前端页面 1.2 HTM...

  • 1_4参数传递

    1.在常成员函数中,不可以修改类中任意数据成员 double real ()const{ return re; }...

  • ionic4-传递参数

    环境 路由传值 方式一(单个值) 路由定义 跳转 或者 接收 方式二(多个值) 跳转 接收 组件间传值 父 -> ...

  • flutter简单的路由传值

    1.注册路由 2.路由跳转arguments 就是传递的参数名 3.接收参数 4.反向传值 5.接收反向传递的值

  • Go语言学习笔记(三)

    指针 Go的指针不能运算 参数传递 Go的参数传递是值传递(值传递:开辟新的空间,拷贝传递参数的值,引用传递:引用...

  • python3 几个知识点

    参数类型 用必选参数、 一定要传递的参数: def shit(a) a就一定要传递 默认参数 可以不传递的参数,有...

  • Kettle12:Kettle作业和参数

    本章讲解的作业和参数有如下几个案例01 作业02 参数03 表输入参数传递-常量传递04 表输入参数传递-变量传递...

网友评论

      本文标题:WorkManager (4) —— 参数传递

      本文链接:https://www.haomeiwen.com/subject/eijazktx.html