IllegalAccessException при постановке в очередь работы с WorkManager - PullRequest
3 голосов
/ 12 марта 2019

Я получаю IllegalAccessException при попытке поставить в очередь работу со стабильной версией WorkManager 1.0. Вот трассировка стека:

E/WM-WorkerFactory: Could not instantiate com.pocket.sdk.util.service.BackgroundSync$SyncJob
    java.lang.IllegalAccessException: java.lang.Class<com.example.BackgroundManager$BackgroundWorker> 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:343)
        at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:92)
        at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:233)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:127)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)

Рабочий - это внутренний класс, объявленный так:

private static class BackgroundWorker extends Worker {
    // ...
}

Как я могу исправить это исключение?

1 Ответ

4 голосов
/ 12 марта 2019

Похоже, что WorkManager использует отражение для создания экземпляра работника.Однако, поскольку он объявлен как private внутренний класс, он недоступен для WorkerFactory класса, который пытается это сделать.

Я просто объявил своих работников как public внутренние классы.Примерно так:

public static class BackgroundWorker extends Worker {
    // ...
}

Я также позаботился о том, чтобы конструктор был общедоступным.

Но я бы хотел найти решение, которое не требовало бы ознакомления работников со всем миром..

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