21

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

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。

4

2 回答 2

12

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

我的要求是通过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课堂上准备就绪。

干杯!

于 2018-12-22T18:32:23.697 回答
7

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

有效类型有:布尔型、整数型、长型、双精度型、字符串型,以及每种类型的数组版本。

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

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

于 2018-07-04T18:01:13.100 回答