WorkManger в Android выполняет doWork () более одного раза - PullRequest
0 голосов
/ 24 сентября 2018

Я использую WorkManager для планирования некоторых задач, но проблема в том, что менеджер работ выполняет эти задачи {doWork ()} более одного раза за один вызов.


Я использую:

'android.arch.work:work-runtime:1.0.0-alpha08'

Я пробовал использовать -alpha07,06,05,04.Но у меня та же проблема.Иногда он даже выполняется 5-6 раз одновременно


Вот код:

public class MyWorker extends Worker {

@NonNull
@Override
public Result doWork() {

    Log.i("CountWorker","0");
    sendNotification("Notice", "A notice was sent");
    return Result.SUCCESS;

}

Это действие

public class MyWorkerActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final PeriodicWorkRequest pwr = new PeriodicWorkRequest
            .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
            .setConstraints(Constraints.NONE)
            .build();

    WorkManager.getInstance().enqueue(pwr);

}
}

Этоявляется результатом Logcat:

09-24 16:44:35.954 22779-22816/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.970 22779-22817/com.simran.powermanagement I/CountWorker: 0
09-24 16:44:35.977 22779-22818/com.simran.powermanagement I/CountWorker: 0

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Для OneTimeWorkRequest с использованием версии 1.0.0-beta01

WorkManager.getInstance()
            .beginUniqueWork("Unique", ExistingWorkPolicy.KEEP, oneTimeWorkRequest)
            .enqueue();

Отмените существующую последовательность и ЗАМЕНИТЕ ее новой.
СОХРАНИТЕ существующую последовательность и проигнорируйте ваш новый запрос.
APPENDваша новая последовательность к существующей, выполнение первой задачи новой последовательности после завершения последней задачи существующей последовательности

Официальная документация.https://developer.android.com/topic/libraries/architecture/workmanager/advanced

0 голосов
/ 25 сентября 2018

Когда вы enqueue a PeriodicWorkRequest, это не отменяет все существующие PeriodicWorkRequest, которые вы ранее поставили в очередь.Поэтому, как только вы написали свое приложение, каждый раз, когда ваша деятельность начинается, вы добавляете периодический запрос на работу, постепенно переходя от 1 до 2 к 3.

Вместо этого вы хотите использовать enqueueUniquePeriodicWork():

Этот метод позволяет ставить в очередь уникальное имя PeriodicWorkRequest, где одновременно может быть активен только один PeriodicWorkRequest с конкретным именем.Например, вы можете захотеть, чтобы была активна только одна операция синхронизации.Если есть одно ожидание, вы можете разрешить его запуск или заменить его новой работой.uniqueWorkName уникально идентифицирует этот PeriodicWorkRequest.

С кодом, таким как:

final PeriodicWorkRequest pwr = new PeriodicWorkRequest
        .Builder(MyWorker.class, 16, TimeUnit.MINUTES)
        .setConstraints(Constraints.NONE)
        .build();

WorkManager.getInstance().enqueueUniquePeriodicWork(
    "my_worker",
    ExistingPeriodicWorkPolicy.REPLACE,
    pwr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...