Android Work Manager: «Не удалось создать экземпляр Worker» - PullRequest
0 голосов
/ 05 октября 2018

Я следовал учебнику Android по использованию структуры Worker Manager для запуска моего кода в фоновом режиме, но всякий раз, когда я пытаюсь поставить в очередь моего работника, он не запускается, и я получаю следующую ошибку:

2018-10-04 22:25:47.004 28669-28885/app.package.com.debug E/DefaultWorkerFactory: Could not instantiate app.package.com.MyWorker
    java.lang.NoSuchMethodException: <init> []
        at java.lang.Class.getConstructor0(Class.java:2320)
        at java.lang.Class.getDeclaredConstructor(Class.java:2166)
        at androidx.work.DefaultWorkerFactory.createWorker(DefaultWorkerFactory.java:58)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:180)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:117)
        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)
2018-10-04 22:25:47.005 28669-28885/app.package.com.debug E/WorkerWrapper: Could for create Worker app.package.com.MyWorker

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

Мой работник объявлен как:

public class MyWorker extends Worker {

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        // Doesn't even get called
    }
}

И это ставится в очередь следующим образом:

WorkManager workManager = WorkManager.getInstance();
if (myWorkerRequest == null) {
    myWorkerRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
            .setConstraints(new Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED)
                    .build())
            .build();
}
WorkStatus workStatus = workManager.getStatusById(myWorkerRequest.getId()).getValue();
if (workStatus == null || !workStatus.getState().isFinished()) {
    workManager.enqueue(myWorkerRequest);
}

Я не вижу ничего отличного от примеров, поэтому я хотел бы понять, что еще может повлиять на мой код длявызвать эту аварию.Может ли это быть что-то, связанное с ProGuard?

Моя версия 1.0.0-alpha09

Спасибо!

Ответы [ 4 ]

0 голосов
/ 15 июля 2019

Проблемой для меня был конструктор моего класса kotlin:

НЕПРАВИЛЬНО

class MyWorker(val app: Application, workerParams: WorkerParameters): Worker(app, workerParams)

ХОРОШО

class MyWorker(val context: Context, workerParams: WorkerParameters): Worker(context, workerParams)
0 голосов
/ 06 марта 2019

У меня была эта проблема в стабильной версии 1.0.0, и я исправил ее, сделав свой рабочий класс общедоступным.

class MyWorker extends Worker {...} > public class MyWorker extends Worker {...}
0 голосов
/ 04 апреля 2019

У меня была такая же проблема.Причиной проблемы для меня было то, что мой класс Worker был вложенным классом.В тот момент, когда я сделал это независимым классом, это сработало.

0 голосов
/ 05 октября 2018

Это известная проблема с WorkManager 1.0.0-alpha09, которая уже помечена как исправленная для alpha10.

В качестве обходного пути вы можете добавить следующие строки в конфигурацию Proguard:

-keepclassmembers class * extends androidx.work.Worker {
    public <init>(android.content.Context,androidx.work.WorkerParameters);
}
...