我正在创建的应用程序必须具有某种上载图像的后台过程,而我正在尝试使用androidx.work.Worker
和androidx.work.WorkManager
进行此操作。我正在从应用程序的onCreate
运行以下代码:
@Override
public void onCreate() {
super.onCreate();
(...)
initiateUploadJob();
}
private void initiateUploadJob() {
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build();
PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
UploadWorker.class, 15, TimeUnit.MINUTES)
.setConstraints(constraints)
.build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(UploadWorker.class.getName(),
ExistingPeriodicWorkPolicy.KEEP, workRequest);
}
这是工人阶级:
public class UploadWorker extends Worker {
@Inject
ImageUploader imageUploader;
@Inject
AuthenticationManager authenticationManager;
public UploadWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
getDaggerComponent(context).inject(this);
}
@NonNull
@Override
public Result doWork() {
if (NetworkChecker.isNetworkAvailable(getApplicationContext())) {
imageUploader.uploadImages(
authenticationManager.getCurrentUser(),
getApplicationContext());
return Result.success();
}
return Result.failure();
}
}
我希望这会导致UploadWorker
的一个实例每15分钟执行一次doWork
方法,或者可能每15分钟创建一个新实例,并在执行时执行doWork
被创建,但这不是最终发生的事情。正如通过在worker的构造函数和doWork
的第一行中设置断点所验证的那样,我得到了多个(最多4个)实例同时运行。工人不会失败-他们所有人每次都能到达return Result.success();
。
为什么我要获得多个工人实例,以及如何一次回到一个实例?