如何在android中将复杂类型的对象传递给WorkManager。即列表、地图、POJO

Job*_*b M 5 android android-architecture-components android-jetpack android-workmanager

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何传递复杂类型,例如:

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();
Run Code Online (Sandbox Code Playgroud)

Job*_*b M 5

如果可能的话,您可以序列化您的 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);
Run Code Online (Sandbox Code Playgroud)