Android WorkManager的doWork()为OneTimeWorkRequest多次调用
我刚刚开始在我的应用程序中探索Android WorkManager的doWork()为OneTimeWorkRequest多次调用,android,android-architecture-components,android-workmanager,countdownlatch,Android,Android Architecture Components,Android Workmanager,Countdownlatch,我刚刚开始在我的应用程序中探索WorkManager。我的应用程序大部分是离线的,所以所有的数据都使用roomdb存储在本地。一旦设备连接到网络,我想将本地数据同步到服务器,然后获取最新数据并再次同步本地数据库。这是我的doWork()方法实现- @NonNull @Override public Result doWork() { Worker.Result[] result = {Worker.Result.retry()}; count = new CountDownLat
WorkManager
。我的应用程序大部分是离线的,所以所有的数据都使用roomdb存储在本地。一旦设备连接到网络,我想将本地数据同步到服务器,然后获取最新数据并再次同步本地数据库。这是我的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 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()
返回成功结果。但我的问题是,我的嫁妆被多次调用,我猜这是因为结果返回为重试?但我不明白为什么?你明白了吗?有同样的问题。使用enqueueUniqueWork()代替enqueue()@AnandTiwari,干得好