Android Work Manager: "Не удалось создать экземпляр рабочего стола"
Я следил за учебником Android Developer по использованию структуры 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
Спасибо!
Ответы
Ответ 1
Это известная проблема с WorkManager 1.0.0-alpha09, которая уже отмечена как фиксированная для альфа10.
В качестве обходного пути вы можете добавить следующие строки в конфигурацию proguard:
-keepclassmembers class * extends androidx.work.Worker {
public <init>(android.content.Context,androidx.work.WorkerParameters);
}
Ответ 2
Я была такая же проблема. Причиной проблемы для меня было то, что мой класс Worker был вложенным классом. В тот момент, когда я сделал это независимым классом, это сработало.
Ответ 3
У меня была эта проблема в стабильной версии 1.0.0, и я исправил ее, сделав свой рабочий класс общедоступным.
class MyWorker extends Worker {...} > public class MyWorker extends Worker {...}
Ответ 4
В моем случае я переопределил конструктор Worker с большим количеством параметров, но это недопустимо. Расширяющий конструктор класса должен иметь только параметры Context и WorkerParameters.
Ответ 5
Проблемой для меня был конструктор моего класса kotlin:
НЕПРАВИЛЬНО
class MyWorker(val app: Application, workerParams: WorkerParameters): Worker(app, workerParams)
ХОРОШО
class MyWorker(val context: Context, workerParams: WorkerParameters): Worker(context, workerParams)