web-dev-qa-db-fra.com

Comment passer la classe POJO dans Work Manager dans Android?

Comment passer l'objet Serializable dans gestionnaire de travaux par la méthode setData du gestionnaire de travaux? Existe-t-il un moyen de traiter avec Work Manager en passant un objet?

WorkManager est une bibliothèque utilisée pour mettre en file d'attente un travail dont l'exécution est garantie une fois ses contraintes respectées. WorkManager permet d'observer l'état du travail et de créer des chaînes de travail complexes.

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

Il plante l'application et affiche une erreur comme AddressBookData n'est pas une classe valide.

Remarque: je veux passer la classe POJO dans le gestionnaire de travail et obtenir InputData du gestionnaire de travail dans la méthode doWork.

12

Vous ne pouvez pas fournir directement un POJO pour un WorkManager. Voir le documentation du Data.Builder#putAll méthode:

Les types valides sont les versions booléenne, entière, longue, double, chaîne et tableau de chacun de ces types.

Si possible, vous pouvez sérialiser votre POJO. Par exemple, s'il est vraiment petit et simple, vous pouvez utiliser JSON pour le coder en chaîne, puis le décoder dans le Worker.

Cependant, pour les classes plus compliquées, je les stocke personnellement dans la base de données (SQLite, Room) puis je passe juste la clé primaire de l'objet donné. Le travailleur récupère ensuite l'objet dans la base de données. Cependant, d'après mon expérience, cela peut généralement être évité.

6
Martin Melka

Aujourd'hui, je suis également confronté à ce problème. Je trouve donc le moyen de passer un objet.

Mon exigence est passer Bitmap objet. (Vous pouvez passer selon votre condition)

Ajoutez des dépendances dans votre fichier Gradle

Gradle:

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

Utilisez la méthode ci-dessous pour sérialiser et désérialiser l'objet

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

Sérialiser l'objet.

 String bitmapString = Helper.serializeToJson(bmp);

Passez à l'objet de données.

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

Gérez votre valeur dans la classe Worker.

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

Votre objet bitmap est maintenant prêt dans la classe Worker.

À votre santé !

2
Yogesh Rathi