如何在 Android 的 WorkManager 中创建带参数的 Worker?
How to create a Worker with parameters for in WorkManager for Android?
Android 体系结构有一个新组件 WorkManager。
来自example,
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()
如何创建一个 Worker
在构造函数或 doWork
中接受参数?
您可以像Bundle一样使用setInputData
方法发送数据。
/*** 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.)
}
}
有关详细信息,请访问此 link。
在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();
}
}
希望对您有所帮助。
Android 体系结构有一个新组件 WorkManager。
来自example,
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()
如何创建一个 Worker
在构造函数或 doWork
中接受参数?
您可以像Bundle一样使用setInputData
方法发送数据。
/*** 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.)
}
}
有关详细信息,请访问此 link。
在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();
}
}
希望对您有所帮助。