首页 > 解决方案 > 使用 WorkManager 排队工作时出现 IllegalAccessException

问题描述

IllegalAccessException在尝试使用 WorkManager 1.0 stable 排队工作时得到。这是堆栈跟踪:

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)

worker 是一个内部类,声明如下:

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

我该如何解决这个异常?

标签: androidandroid-workmanager

解决方案


看起来 WorkManager 正在使用反射来创建工作者的实例。但是,由于它被声明为private内部类,因此WorkerFactory尝试执行此操作的类无法访问它。

我所做的只是简单地将我的工人声明为public内部类,如下所示:

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

我还确保构造函数是公开的。

但我很想找到一个不需要让工人暴露在全世界的解决方案。


推荐阅读