PeriodicWorkRequest не инициируется WorkManager на устройствах реального времени, кроме эмулятора - PullRequest
0 голосов
/ 21 июня 2019

Я ставлю в очередь от PeriodicWorkRequest до WorkManager, упомянутый ниже код работает на устройстве с операционной системой Android OS Nougat, а также на эмуляторах ОС Android версий 8.1, 9 и 10, но не на OnePlus (Android 9), Redmi 5(Android 8.1) и Google Pixel (Android 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

Ответы [ 2 ]

1 голос
/ 23 июня 2019

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

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

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

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

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

После стольких попыток я создал проблему в Google Issue Tracker в разделе 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

Ваш работник должен быть публичным

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

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

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