如何通过工作管理器的setData方法在工作管理器中传递可序列化对象?有什么方法可以通过传递对象来与工作管理器进行处理?
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。
答案 0 :(得分:4)
您不能直接为WorkManager提供POJO。请参见Data.Builder#putAll
方法的documentation:
有效类型为:布尔,整数,长整型,双精度型,字符串和数组 每种类型的版本。
如果可能,您可以序列化POJO。例如,如果确实很小又简单,则可以使用JSON将其编码为字符串,然后在Worker中对其进行解码。
但是,对于更复杂的类,我个人将它们存储在数据库(SQLite,Room)中,然后仅传递给定对象的主键。然后,Worker从数据库中获取对象。但是,以我的经验,通常可以避免。
答案 1 :(得分:1)
今天,我也遇到了这个问题。所以我找到了传递对象的方法。
我的要求是传递 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
类中的位图对象已准备就绪。
干杯!