WorkManager的doWork()为OneTimeWorkRequest调用了多次

时间:2020-05-24 10:53:16

标签: android android-architecture-components android-workmanager countdownlatch

我刚刚开始在我的应用中探索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被多次调用,我猜这是因为结果返回为重试吗?但是我不知道为什么吗?

0 个答案:

没有答案
相关问题