如何在Android中使用WorkManager创建带参数的Worker?

65

Android架构新增了一个组件WorkManager

示例中可以看到,

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)

    }

}

val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>().build()

如何创建一个可以在构造函数或 doWork 中接受参数的 Worker

2个回答

111
您可以使用 setInputData 方法像Bundle一样发送数据。
/***  Logic to set Data while creating worker **/
val compressionWork = OneTimeWorkRequest.Builder(CompressWorker::class.java)
val data = Data.Builder()
//Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter.
data.putString("file_path", "put_file_path_here")
//Set Input Data
compressionWork.setInputData(data.build())
//enque worker
WorkManager.getInstance().enqueue(compressionWork.build())


/*** Logic to get Data  ***/
class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        //get Input Data back using "inputData" variable 
        val filePath =  inputData.getString("file_path")

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to try again.)

    }

}

欲了解更多信息,请访问此链接


我如何访问Worker中的数据? - Joshua
3
params.getInputData().getString("file_path") - Titto Jose
21
有没有办法将非基本类型的值作为参数发送? - Óscar
1
回答@Óscar的问题,这里有一个关于如何将可序列化的POJO传递给Worker的讨论:https://dev59.com/H1UK5IYBdhLWcg3w_z60 - Marino
4
谨慎使用workDataOf。尽管它的方法签名允许传递其它类型的参数,但是由于Data对象只能包含基本类型或者基本类型数组,因此你只能传递这些类型的参数。如果你尝试传递其它类型的参数,就会收到一个IllegalArgumentException异常。 - nkotula
显示剩余2条评论

35

在Java中:

按以下方式传递参数:

    Constraints.Builder builder = new Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED);

    // Passing params
    Data.Builder data = new Data.Builder();
    data.putString("SyncMaster", syncModuleName);

    OneTimeWorkRequest syncWorkRequest =
            new OneTimeWorkRequest.Builder(SyncWorker.class)
                    .addTag("Sync")
                    .setInputData(data.build())
                    .setConstraints(builder.build())
                    .build();

    WorkManager.getInstance().enqueue(syncWorkRequest);

你可以像这样获得:

public class SyncWorker extends Worker {

    private static final String TAG = "MyWorker";

    public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
        mContext = context;
    }

    @NonNull
    @Override
    public Result doWork() {
        Log.d(TAG, "doWork for Sync");
        String syncTable = getInputData().getString("SyncMaster");
        return Result.success();
    }
}

希望这能清楚地帮助到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接