如何通过工作管理器的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。
今天我也遇到这个问题了。所以我找到了传递对象的方法。
我的要求是通过
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
类中准备就绪。
干杯!
您不能直接为 WorkManager 提供 POJO。请参阅 Data.Builder#putAll
方法的
文档:
有效类型有:Boolean、Integer、Long、Double、String 和 array 每种类型的版本。
如果可能,您可以序列化您的 POJO。例如,如果它确实很小很简单,您可以使用 JSON 将其编码为字符串,然后在 Worker 中对其进行解码。
但是,对于更复杂的类,我个人将它们存储在数据库(SQLite、Room)中,然后只传递给定对象的主键。然后,Worker 从数据库中获取对象。然而,根据我的经验,这通常是可以避免的。
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));
}