Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Pass POJO class in Work manager in android?

How can we pass Serializable object in work manager by setData method of work manager? Is there any way to process with Work manager by passing object?

WorkManager is a library used to enqueue work that is guaranteed to execute after its constraints are met. WorkManager allows observation of work status and the ability to create complex chains of work.

 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();

It crash app and showing error like AddressBookData is not valid class.

Note: I want to pass POJO class in work manager and get InputData from work manager in doWork Method.

like image 232
Vishal Patoliya ツ Avatar asked Jun 25 '18 07:06

Vishal Patoliya ツ


2 Answers

Today, I also faced this issue. So I found the way to pass an object.

My Requirement is pass Bitmap object. (You can pass as per your requirement)

Add dependency in your Gradle file

Gradle:

dependencies {
  implementation 'com.google.code.gson:gson:2.8.5'
}

Use the below method for serializing and de-serializing the object

 // 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);
    }

Serialize object.

 String bitmapString = Helper.serializeToJson(bmp);

Pass to the data object.

 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);

Handle your value in Worker class.

Data data = getInputData();
String bitmapString = data.getString(NOTIFICATION_BITMAP);
Bitmap bitmap = Helper.deserializeFromJson(bitmapString);

Now your bitmap object is ready in Worker class.

Cheers !

like image 135
Yogesh Rathi Avatar answered Oct 17 '22 02:10

Yogesh Rathi


You cannot directly provide a POJO for a WorkManager. See the documentation of the Data.Builder#putAll method:

Valid types are: Boolean, Integer, Long, Double, String, and array versions of each of those types.

If possible, you may serialize your POJO. For example, if it is truly small and simple, you can use JSON to encode it to string and then decode it in the Worker.

However, for more complicated classes, I personally store them in the database (SQLite, Room) and then just pass the primary key of the given object. The Worker then fetches the object from the database. However, in my experience that can be usually avoided.

like image 23
Martin Melka Avatar answered Oct 17 '22 02:10

Martin Melka