Android синхронизация данных фона и переднего плана - PullRequest
0 голосов
/ 30 января 2020

В настоящее время я разрабатываю приложение, которое должно синхронизировать данные с сервером каждые 15 минут и вручную, если нажата кнопка syn c. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что синхронизация не ставится в очередь. Ручное задание syn c может выполняться одновременно с автоматически запускаемым, и это не должно быть возможным. Синхронизация c будет go неправильной, если одни и те же данные отправляются дважды в одно и то же время.

Я пробовал JobService и WorkManager, но не могу придумать правильного решения. Я создал PeriodicWorkRequest и OneTimeWorkRequest. Они должны стоять в очереди и запускаться после завершения активной задачи.

Есть мысли?

1 Ответ

0 голосов
/ 31 января 2020

Я исправил это так. Я думаю, что это должно работать:

планирование фона:

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build();
PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(SyncWorker.class,15, TimeUnit.MINUTES).setConstraints(constraints).build();
WorkManager.getInstance().enqueueUniquePeriodicWork(SyncWorker.BACKGROUND_SYNC, ExistingPeriodicWorkPolicy.KEEP, workRequest);

передний план / активная синхронизация c:

OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(SyncWorker.class).build();
WorkManager.getInstance().enqueueUniqueWork(SyncWorker.FOREGROUND_SYNC, ExistingWorkPolicy.KEEP, workRequest);

Для управления синхронизацией фона и переднего плана:

public class SyncWorker extends Worker {

    public final static String FOREGROUND_SYNC = "FOREGROUND";
    public final static String BACKGROUND_SYNC = "BACKGROUND";
    private static boolean isWorking = false;

    public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        if(isWorking) {
            return Result.failure();
        }

        isWorking = true;

        // sync

        isWorking = false;
        return Result.success();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...