android中如何将自己的类传递给Worker?

问题描述 投票:0回答:3

如何通过工作管理器的setData方法在工作管理器中传递Serialized对象?有没有办法通过传递对象来处理工作管理器?

WorkManager 是一个用于将工作排队的库,保证在满足其约束后执行。 WorkManager 允许观察工作状态并能够创建复杂的工作链。

 Map<String, Object> map = new HashMap<>();
 AddressBookData addressBookData = new AddressBookData();
 addressBookData.setThreadId(001);

 map.put("AddressBookData", addressBookData);


 Data data = new Data.Builder()
                    .putAll(map)
                    .build();

 OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(DataSyncWorker.class)
                        .setInputData(data)
                        .build();

它会使应用程序崩溃并显示错误,例如 AddressBookData 不是有效的类。

注意:我想在工作管理器中传递POJO类,并在doWork方法中从工作管理器获取InputData。

android android-jetpack android-workmanager
3个回答
14
投票

今天我也遇到这个问题了。所以我找到了传递对象的方法。

我的要求是通过

Bitmap
对象。 (根据您的要求即可通过)

在 Gradle 文件中添加依赖项

摇篮:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}

使用下面的方法来序列化和反序列化对象

 // Serialize a single object.
    public static String serializeToJson(Bitmap bmp) {
        Gson gson = new Gson();
        return gson.toJson(bmp);
    }

    // Deserialize to single object.
    public static Bitmap deserializeFromJson(String jsonString) {
        Gson gson = new Gson();
        return gson.fromJson(jsonString, Bitmap.class);
    }

序列化对象。

 String bitmapString = Helper.serializeToJson(bmp);

传递给数据对象。

 Data.Builder builder = new Data.Builder();
 builder.putString("bmp, bitmapString);
 Data data = builder.build();
        OneTimeWorkRequest simpleRequest = new OneTimeWorkRequest.Builder(ExampleWorker.class)
                .setInputData(data)
                .build();
        WorkManager.getInstance().enqueue(simpleRequest);

Worker
课堂上处理你的价值。

Data data = getInputData();
String bitmapString = data.getString(NOTIFICATION_BITMAP);
Bitmap bitmap = Helper.deserializeFromJson(bitmapString);

现在您的位图对象已在

Worker
类中准备就绪。

干杯!


7
投票

您不能直接为 WorkManager 提供 POJO。请参阅 Data.Builder#putAll 方法的

文档

有效类型有:Boolean、Integer、Long、Double、String 和 array 每种类型的版本。

如果可能,您可以序列化您的 POJO。例如,如果它确实很小很简单,您可以使用 JSON 将其编码为字符串,然后在 Worker 中对其进行解码。

但是,对于更复杂的类,我个人将它们存储在数据库(SQLite、Room)中,然后只传递给定对象的主键。然后,Worker 从数据库中获取对象。然而,根据我的经验,这通常是可以避免的。


0
投票

WorkManager 仅允许这些类型 - Byte、Integer、Long、Boolean、Double、String、Float 和这些类型的数组。否则会抛出 IllegalArgumentException 这是Data类的内部实现-

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));
                }
© www.soinside.com 2019 - 2024. All rights reserved.