WorkManager выполняет enqueueUniquePeriodicWork () несколько раз одновременно? - PullRequest
1 голос
/ 20 июня 2019

Я новичок в этом, поэтому дайте мне знать, если вопрос сформулирован неверно!У меня есть приложение для Android, которое должно выполнять задачу примерно каждые 15 минут, даже если телефон заблокирован.Контекст таков: - Я нацеливаюсь на SDK 23 или выше - Задача 1) принимает местоположение пользователя 2) выполняет вызов HTTPS API с помощью OKHttpClient, затем 3) отправляет результаты в базу данных Firestore

I 'Я использую WorkManager, чтобы попытаться достичь этой цели.Однако проблема в том, что каждый раз, когда он выполняется, он делает это 8 - 9 раз, и это очень нерегулярно по времени.Я могу видеть это из записей Firestore и Logcat.

Является ли WorkManager правильным способом решения этой задачи?Я использую

implementation "androidx.work:work-runtime:2.0.1"
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.ExistingPeriodicWorkPolicy;

Я вижу, что у других была эта проблема: Работник Android выполняет задание несколько раз

//In MainActivity.java: 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(
                PeriodicReadings.class, 15, TimeUnit.MINUTES).build();

        WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);

//In PeriodicReadings.java:

    @NonNull
    @Override
    public Result doWork() {
        getReadings(); //work to be done 
        return Result.success();
    }

Каждые 15 минут я ожидал, что чтениепоявляются в базе данных Firestore, но вместо этого я вижу партии из 8 - 9 показаний, которые появляются с нерегулярными интервалами, меняющимися каждые 15 минут - 2 часа.

Я попытался очистить и перестроить, сделать недействительным и перезапустить кеш, а также перезагрузить приложениепо телефону.

1 Ответ

0 голосов
/ 21 июня 2019

Вы ставите работу в очередь в Activity # onCreate (), поэтому каждый раз, когда ваша деятельность создается, вы ставите в очередь новый WorkRequest. Именно поэтому вы увидите несколько экземпляров рабочего запроса. Возможно, вам нужен API enqueueUniquePeriodicWork ().

...