android - 使用 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 {
// ...
}
我该如何解决这个异常?
解决方案
看起来 WorkManager 正在使用反射来创建工作者的实例。但是,由于它被声明为private
内部类,因此WorkerFactory
尝试执行此操作的类无法访问它。
我所做的只是简单地将我的工人声明为public
内部类,如下所示:
public static class BackgroundWorker extends Worker {
// ...
}
我还确保构造函数是公开的。
但我很想找到一个不需要让工人暴露在全世界的解决方案。
推荐阅读
- python - 如何在二进制图像中随机拾取非零像素的位置?
- python - 为什么调用 Python 的“魔术方法”不像对应的运算符那样进行类型转换?
- python - Python Pandas - 在所有列的单元格中搜索正则表达式匹配
- java - 测试 LITTLE_ENDIAN 和 BIG_ENDIAN 方案
- java - 如何显示我自己的 FileNotFoundException 消息
- networkx - 如何删除networkx中的随机边?
- nativescript - Tabview 与 GridLayout 与 DockLayout
- flutter - Flutter Horizontal ListView下添加行而不是无限滚动
- angular - 在 Angular Observable 拦截器中使用 Promise 中的值
- python - Pandas 使用单元格值作为 dict 键返回 dict 值