Как передать класс POJO в диспетчере работ в Android?

Как мы можем передать объект Serializable в диспетчере работ с помощью метода 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 в диспетчере работ и получить InputData из диспетчера работ в методе doWork.


person Vishal Patoliya ツ    schedule 25.06.2018    source источник
comment
поделитесь своим кодом.   -  person Hemant Parmar    schedule 25.06.2018
comment
@HemantParmar Отредактированный вопрос, пожалуйста, посмотрите.   -  person Vishal Patoliya ツ    schedule 25.06.2018
comment
поделитесь своим классом AddressBookData.   -  person Hemant Parmar    schedule 25.06.2018
comment
@HemantParmar Вы можете рассматривать любой класс pojo с инструментами Serializable.   -  person Vishal Patoliya ツ    schedule 25.06.2018
comment
вы получаете ошибку в классе AddressBookData. вот почему!   -  person Hemant Parmar    schedule 25.06.2018
comment
Вы работаете с менеджером по работе? @HemantParmar   -  person Vishal Patoliya ツ    schedule 25.06.2018
comment
Я пробовал передавать другой класс POJO в диспетчере работ, но каждый раз получаю эту ошибку. Есть ли у вас какое-нибудь решение для этого? @HemantParmar   -  person Vishal Patoliya ツ    schedule 25.06.2018
comment
вы не использовали оба класса AddressBookData и DataSyncWorker, как я могу найти для вас решение?   -  person Hemant Parmar    schedule 25.06.2018
comment
@HemantParmar Невозможно передать класс POJO в диспетчере работ, потому что он поддерживает только несколько типов данных и массивов для передачи во входные данные.   -  person Vishal Patoliya ツ    schedule 25.06.2018
comment
Просто преобразуйте ваш объект в строку с помощью Gson и передайте его InputData, а в рабочем классе снова преобразуйте обратно в ваш объект pojo.   -  person Siddhesh Shirodkar    schedule 13.06.2019


Ответы (2)


Сегодня я тоже столкнулся с этой проблемой. Итак, я нашел способ передать объект.

Мое требование - передать объект Bitmap. (Вы можете пройти в соответствии с вашими требованиями)

Добавьте зависимость в свой файл Gradle

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.

Ваше здоровье !

person Yogesh Rathi    schedule 22.12.2018
comment
Это приведет к сбою, когда вы захотите загрузить изображение с высоким разрешением, и второй минус заключается в том, что вам нужно выполнить больше процессов, таких как 1.Serialize в Json и 2. Deserialize в String в. JSON и это очень сложный и рискованный процесс. - person Vishal Patoliya ツ; 24.12.2018
comment
согласен, но это одна из идей, как это сделать - person Yogesh Rathi; 24.12.2018
comment
Короче мы должны передавать String только любыми способами. - person Vishal Patoliya ツ; 24.12.2018
comment
Да, дорогой. Но если каким-то образом мы хотим передать несколько строк, лучше создать pojo и выполнить указанную выше операцию. - person Yogesh Rathi; 25.12.2018

Вы не можете напрямую предоставить POJO для WorkManager. См. документацию в метод Data.Builder#putAll:

Допустимые типы: Boolean, Integer, Long, Double, String и версии массива каждого из этих типов.

Если возможно, вы можете сериализовать свой POJO. Например, если он действительно маленький и простой, вы можете использовать JSON, чтобы закодировать его в строку, а затем декодировать в Worker.

Однако для более сложных классов я лично храню их в базе данных (SQLite, Room), а затем просто передаю первичный ключ данного объекта. Затем Worker извлекает объект из базы данных. Однако, по моему опыту, этого обычно можно избежать.

person Martin Melka    schedule 04.07.2018
comment
Да, мы можем это сделать, но я из Db я получаю массив, а из Arraylist я хочу передать perticular класс pojo и выполнить процесс в диспетчере работ. Да, я уже реализовал это, но если диспетчер работ в директиве поддерживает класс Serializable, я хочу проверить - person Vishal Patoliya ツ; 05.07.2018
comment
И нет никакого способа передать другие экземпляры объекта, потому что данные будут внутренне сериализованы / десериализованы в массив байтов и из него с использованием ObjectOutputStream и ObjectInputStream. Несмотря на то, что там можно написать сериализуемый экземпляр, Google разрешил только примитивные типы. - person TheRealChx101; 23.03.2019
comment
Моя архитектура требует, чтобы я передавал общий экземпляр моему статическому Worker для вызова некоторых методов в этом экземпляре. У меня нет другого выбора, кроме как использовать синглтон; очень некрасиво. - person TheRealChx101; 23.03.2019