Как передать сложные типы объектов в WorkManager в Android. то есть списки, карты, POJO - PullRequest
0 голосов
/ 06 ноября 2018

WorkManager - это библиотека, используемая для постановки в очередь работы, которая гарантированно будет выполняться после выполнения ее ограничений. WorkManager позволяет наблюдать за состоянием работы и создавать сложные цепочки работ.

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

// Define the Worker class:
public class MathWorker extends Worker {

    // Define the parameter keys:
    public static final String KEY_X_ARG = "X";
    public static final String KEY_Y_ARG = "Y";
    public static final String KEY_Z_ARG = "Z";
    // ...and the result key:
    public static final String KEY_RESULT = "result";

    public MathWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Worker.Result doWork() {
        // Fetch the arguments (and specify default values):
        int x = getInputData().getInt(KEY_X_ARG, 0);
        int y = getInputData().getInt(KEY_Y_ARG, 0);
        int z = getInputData().getInt(KEY_Z_ARG, 0);

        // ...do the math...
        int result = myCrazyMathFunction(x, y, z);

        //...set the output, and we're done!
        Data output = new Data.Builder()
            .putInt(KEY_RESULT, result)
            .build();
        setOutputData(output);
        return Result.SUCCESS;
    }
}

Как я могу передать сложные типы, такие как:

Map<String, Object> studListMap = new HashMap<>();
        studListMap.put("list", studentDetails);

        // Create the Data object:
        @SuppressLint("RestrictedApi")
        Data myData = new Data.Builder()
                .put(KEY_STUD_LIST_ARG,studListMap)
                .build();

        //set network required
        Constraints myConstraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Сохраните его в базе данных, или вы можете использовать JsonStore от IBM, затем использовать rxjava для его извлечения, и при успешном извлечении просто вызовите то, что вы указали в doWork. Простой.

0 голосов
/ 06 ноября 2018

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

Использовали gson, так как это уже зависимость в этом приложении.

 Map<String, Object> studListMap = new HashMap<>();
        studListMap.put("list", studentDetails);

        Type listOfStudObject = new TypeToken<List<StudentDetails>>(){}.getType();
        String s = gson.toJson(studentDetails, listOfStudObject);

        // Create the Data object:
        @SuppressLint("RestrictedApi")
        Data myData = new Data.Builder()
                .putString(KEY_STUD_LIST_ARG,s)
                .build();

        //set network required
        Constraints myConstraints = new Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build();

        // ...then create and enqueue a OneTimeWorkRequest that uses those arguments
        OneTimeWorkRequest attendWork = new OneTimeWorkRequest.Builder(AddAttendanceWorker.class)
                .setConstraints(myConstraints)
                .setInputData(myData)
                .build();

        WorkManager.getInstance()
                .enqueue(attendWork);
...