24 votes

Comment passer une classe POJO dans le gestionnaire de travail sous Android ?

Comment pouvons-nous passer Serializable objet dans gestionnaire du travail par la méthode setData du gestionnaire de travail ? Existe-t-il un moyen de traiter avec le Work Manager en passant un objet ?

WorkManager est une bibliothèque utilisée pour mettre en file d'attente des travaux dont l'exécution est garantie une fois les contraintes respectées. WorkManager permet d'observer l'état des travaux et de créer des chaînes de travaux 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();

L'application se plante et affiche une erreur comme AddressBookData n'est pas une classe valide.

Note : Je veux passer la classe POJO dans le gestionnaire de travail et obtenir les données d'entrée du gestionnaire de travail dans la méthode doWork.

14voto

Yogesh Rathi Points 3528

Aujourd'hui, je suis également confronté à ce problème. J'ai donc trouvé le moyen de passer l'objet.

Mon exigence est de passer Bitmap objet. (Vous pouvez passer selon vos besoins)

Ajouter la dépendance 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érialise l'objet.

 String bitmapString = Helper.serializeToJson(bmp);

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

Traitez votre valeur en Worker classe.

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

Maintenant votre objet bitmap est prêt dans Worker classe.

A la vôtre !

7voto

Martin Melka Points 1072

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

Les types valides sont : Booléen, entier, long, double, chaîne de caractères 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 et le décoder ensuite dans le Worker.

Cependant, pour les classes plus compliquées, je les stocke personnellement dans la base de données (SQLite, Room) et passe ensuite simplement la clé primaire de l'objet donné. Le Worker va alors chercher l'objet dans la base de données. Cependant, d'après mon expérience, cela peut généralement être évité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X