我刚刚开始在我的应用中探索WorkManager
。我的应用程序大部分将处于脱机状态,因此所有数据都使用room db存储在本地。设备连接到网络后,我想将本地数据同步到服务器,然后获取最新数据并再次同步本地数据库。这是我的doWork()
方法实现-
@NonNull
@Override
public Result doWork() {
Worker.Result[] result = {Worker.Result.retry()};
count = new CountDownLatch(1);
Context context = getApplicationContext();
try {
new NetworkHelper.NetworkBuilder(context)
.setRequestMethod(NetworkHelper.NetworkBuilder.RequestMethod.GET)
.setTag(NetworkHelper.NetworkBuilder.TAG.FETCH)
.setResponseListener((response, requestMethod, isError) -> {
Utils.printError("onResponse " + isError);
if (!isError) {
clearDataAndInsert(String.valueOf(response));
}
})
.build().callFetchData();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
count.await();
} catch (InterruptedException e) {
Utils.printDebug(e.getMessage());
}
Utils.printError(result[0].toString());
return result[0];
}
在clearDataAndInsert()
中,我使用room将从服务器获取的数据插入到本地db,为此,我构建了自己的回调侦听器,并使用atmoic整数(例如,atmoic integer)检查所有数据是否已成功插入db中。这个-
@Override
public void onTaskComplete() {
int remaining = task.decrementAndGet();
if (remaining == 0) {
Data source = new Data.Builder()
.putString("workInfo", "completed")
.build();
result[0] = Worker.Result.success(source);
count.countDown();
}
}
这就是我对数据进行排队的方式-
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresDeviceIdle(false)
.build();
Data source = new Data.Builder()
.putString("workType", "OneTime")
.build();
OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(SyncWorker.class)
.setConstraints(constraints)
.setInputData(source)
.build();
WorkManager.getInstance(context).enqueue(request);
如您所见,我正在使用CountDownLatch
等待提取并插入本地数据库进程中,然后从doWork()
返回成功结果。但是我的问题是,我的doWork被多次调用,我猜这是因为结果返回为重试吗?但是我不知道为什么吗?