PeriodicWorkRequest не инициируется WorkManager на устройствах реального времени, кроме эмулятора

Я ставлю в очередь от PeriodicWorkRequest до WorkManager, код, указанный ниже, работает на устройстве с ОС Android Nougat, а также на эмуляторах ОС Android версий 8.1, 9 и 10, но не на OnePlus (Android 9), Redmi 5 (Android 8.1) и Google Pixel. (Андроид 9.1).

Зависимость, которую я включил,

implementation "android.arch.work:work-runtime:1.0.1" (Non Androidx)

Также

implementation "android.arch.work:work-runtime:2.1.0-beta02" (Androidx)

Фрагмент кода,

PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest.Builder(MyWorker.class,
                PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS)
            .addTag(Utils.TAG_WORKER)
            .setInputData(createInputData(config));
WorkManager.getInstance(Context).enqueueUniquePeriodicWork(Utils.TAG_WORKER, ExistingPeriodicWorkPolicy.KEEP, builder.build());

private Data createInputData(Config config) {
    return new Data.Builder()
            .putString(Utils.USER_CONFIG, new Gson().toJson(config))
            .putString(Utils.LOCATION_CONFIG, new Gson().toJson(Preferences.getInstance(fragmentActivity).getConfiguration()))
            .build();
}

Я много пробовал и искал, любая помощь в отношении будет высоко оценена.

Пример реализации: https://db.tt/gFEJi39Ofz

Ссылка на систему отслеживания проблем Google: https://issuetracker.google.com/issues/135865377.


person Hassan Jamil    schedule 21.06.2019    source источник
comment
каково значение для PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS?   -  person Deˣ    schedule 21.06.2019
comment
Согласно официальной документации его значение составляет 15 минут или 900000 мс: developer.android .com/reference/androidx/work/   -  person Hassan Jamil    schedule 21.06.2019
comment
Он хоть первый раз запускается?   -  person Jeel Vankhede    schedule 21.06.2019
comment
Нет рабочий не запускается даже в первый раз.   -  person Hassan Jamil    schedule 21.06.2019
comment
Вы пробовали с интервалом 15 минут и TimeUnit как минуты   -  person anshul    schedule 21.06.2019
comment
Да, я также пытался за это (минуты), даже я пытался за большее значение.   -  person Hassan Jamil    schedule 22.06.2019
comment
Также я перенес проект на Androidx и столкнулся с таким же поведением.   -  person Hassan Jamil    schedule 24.06.2019


Ответы (3)


После стольких попыток я создал проблему в системе отслеживания проблем Google в разделе component, также отправили образец кода команде, и они ответили так:

Ваш Worker защищен пакетом, поэтому мы не можем создать его экземпляр с помощью WorkerFactory по умолчанию.

Если бы вы посмотрели на Logcat, вы бы увидели что-то вроде:

2019-06-24 10:49:18.501 14687-14786/com.example.workmanager.periodicworksample E/WM-WorkerFactory: Could not instantiate com.example.workmanager.periodicworksample.MyWorker
    java.lang.IllegalAccessException: java.lang.Class<com.example.workmanager.periodicworksample.MyWorker> is not accessible from java.lang.Class<androidx.work.WorkerFactory>
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:97)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:228)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:127)
        at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:75)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
2019-06-24 10:49:18.501 14687-14786/com.example.workmanager.periodicworksample E/WM-WorkerWrapper: Could not create Worker com.example.workmanager.periodicworksample.MyWorker

Ваш Worker должен быть общедоступным

И, сделав класс My Worker общедоступным, я решил проблему.

Ссылка на ответ Google по проблеме: https://issuetracker.google.com/issues/135865377#comment4

person Hassan Jamil    schedule 25.06.2019
comment
Странно, я никогда не знал, что класс Worker нужно объявлять public... ! Кажется, он работал нормально для меня даже без этого объявления public, пока я не заметил исключение, как вы заявляете... сегодня впервые... несмотря на то, что я использовал WorkManager с момента его создания! Спасибо за ваш пост! - person drmrbrewer; 20.04.2020

Это похоже на то, о чем уже сообщалось на некоторых устройствах от этого OEM. Вот аналогичная ошибка в системе отслеживания проблем WorkManager. В этих случаях WorkManager мало что может сделать.

Как прокомментировано в этой ошибке:

... если производитель устройства решил изменить стандартный Android, чтобы принудительно остановить приложение, WorkManager перестанет работать (как и JobScheduler, сигналы тревоги, приемники вещания и т. д.). Обойти это невозможно. К сожалению, некоторые производители устройств так делают, поэтому в таких случаях WorkManager перестанет работать до следующего запуска приложения.

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

person pfmaggi    schedule 23.06.2019
comment
Спасибо за помощь. Я создал его здесь: issuetracker.google.com/issues/135865377. - person Hassan Jamil; 24.06.2019

На устройствах Oneplus отключите оптимизацию батареи. Перейдите в настройки телефона --› аккумулятор --> лучшая оптимизация --> найдите свое приложение --> отключите оптимизацию теста.

Workmanager работает исправно. Compay просто объединяется с кастомными ОС Android, чтобы увеличить их батарею.

person kanisht sahlot    schedule 18.10.2020