Уникальный период c работа прекращается через некоторое время - PullRequest
0 голосов
/ 06 января 2020

В моем приложении реализована уникальная периодическая c работа с API WorkManager. Работа должна каждые 30 минут проверять онлайн-ресурс и показывать уведомление, если есть непрочитанные уведомления. Да, мне нужна работа periodi c, потому что ресурс является сервером IMAP, и поэтому я не могу использовать уведомления FCM. Однако задание правильно запланировано, как я вижу с помощью dumpsys jobscheduler, но через некоторое время задание прекратилось. Когда я запускаю dumpsys jobscheduler, я читаю что-то вроде этого:

JOB #u0a360/7: aa1b828 com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
    u0a360 tag=*job*/com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
    Source: uid=u0a360 user=0 pkg=com.mypackage.app
    JobInfo:
      Service: com.mypackage.app/androidx.work.impl.background.systemjob.SystemJobService
      Requires: charging=false batteryNotLow=false deviceIdle=false
      Extras: mParcelledData.dataSize=180
      Minimum latency: +29m59s973ms
      Backoff: policy=1 initial=+30s0ms
      Has early constraint
    Required constraints: TIMING_DELAY [0x80000000]
    Satisfied constraints: TIMING_DELAY DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED [0x82400000]
    Unsatisfied constraints: WITHIN_QUOTA [0x1000000]
    Tracking: TIME QUOTA
    Implicit constraints:
      readyNotDozing: true
      readyNotRestrictedInBg: true
    Standby bucket: FREQUENT
    Base heartbeat: 0
      Deferred since: -1h47m30s949ms
    Enqueue time: -1h48m0s986ms
    Run time: earliest=-1h18m1s13ms, latest=none, original latest=none
    Last run heartbeat: 0
    Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

Это проблема Unsatisfied constraints: WITHIN_QUOTA [0x1000000], но, к сожалению, я не смог найти документацию для ошибок такого рода. Официальный от Google довольно расплывчатый: https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging

Вот как я планирую работу:

if (PreferenceController.getInstance().getEmailNotificationInerval() != -1) {
    int interval = PreferenceController.getInstance().getEmailNotificationInerval();

    Constraints constraints = new Constraints.Builder().build();
    PeriodicWorkRequest emailsRequest = new PeriodicWorkRequest.Builder(CheckNewEmailWorker.class, interval, TimeUnit.SECONDS)
            .setConstraints(constraints)
            .build();
    WorkManager.getInstance(context).enqueueUniquePeriodicWork(CheckNewEmailWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, emailsRequest);
}

И я использую BOOT_COMPLETED приемник для запустите его при загрузке.

В рабочем я возвращаю Result.success(), если все идет хорошо, и Result.failure(), если возникает исключение (например, нет соединения).

1 Ответ

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

У вас есть неудовлетворенные ограничения. Вот почему ваш Worker не выполняется.

Unsatisfied constraints: WITHIN_QUOTA [0x1000000]

Обычно это означает, что ваше приложение выполняет слишком много заданий планировщика заданий. Вот почему у вас заканчивается quota. Кроме того, ваш quota определяется резервной корзиной приложения , в которой вы можете оказаться.

Мы добавили некоторую документацию, чтобы помочь диагностировать это: https://developer.android.com/topic/libraries/architecture/workmanager/how-to/debugging

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...