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

时间:2018-06-25 07:32:37

标签: android android-jetpack android-workmanager

如何通过工作管理器的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。

2 个答案:

答案 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类中的位图对象已准备就绪。

干杯!