如何在Android的工作管理器中传递POJO类?

Vis*_*a ツ 12 android android-jetpack android-workmanager

如何通过工作管理器的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();
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*lka 6

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

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

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

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


Yog*_*thi 5

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

我的要求是传递Bitmap对象。(您可以根据需要通过)

在gradle文件中添加依赖项

摇篮:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}
Run Code Online (Sandbox Code Playgroud)

使用以下方法对对象进行序列化和反序列化

 // 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);
    }
Run Code Online (Sandbox Code Playgroud)

序列化对象。

 String bitmapString = Helper.serializeToJson(bmp);
Run Code Online (Sandbox Code Playgroud)

传递给数据对象。

 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);
Run Code Online (Sandbox Code Playgroud)

Worker课堂上处理您的价值。

Data data = getInputData();
String bitmapString = data.getString(NOTIFICATION_BITMAP);
Bitmap bitmap = Helper.deserializeFromJson(bitmapString);
Run Code Online (Sandbox Code Playgroud)

现在,您的位图对象已在Worker类中准备就绪。

干杯!

  • 当您想要上传高分辨率图像时,它会造成崩溃,第二个缺点是您必须执行更多处理,例如 1.Serialize into Json 和 2.Deserialize into String to . JSON 是一个非常复杂且有风险的过程。 (2认同)
  • 是的亲爱的。但是,如果我们想以某种方式传递多个字符串,以便更好地创建 pojo 并执行上述操作。 (2认同)