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,干得好