Android 安卓系统工作经理:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;无法实例化Worker";
我遵循了使用Worker Manager结构在后台运行代码的教程,但每当我尝试将我的Worker排队时,它都不会运行,我会遇到以下错误:Android 安卓系统工作经理:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;无法实例化Worker";,android,androidx,android-workmanager,Android,Androidx,Android Workmanager,我遵循了使用Worker Manager结构在后台运行代码的教程,但每当我尝试将我的Worker排队时,它都不会运行,我会遇到以下错误: 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> []
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
它会像这样排队:
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
谢谢 这是WorkManager 1.0.0-alpha09的版本,已标记为alpha10的固定版本
作为一种解决方法,您可以将以下行添加到proguard配置中:
-keepclassmembers class * extends androidx.work.Worker {
public <init>(android.content.Context,androidx.work.WorkerParameters);
}
-keepclassmembers类*扩展了androidx.work.Worker{
public(android.content.Context、androidx.work.WorkerParameters);
}
我在稳定版1.0.0中遇到了这个问题,我通过公开我的工人类来修复它
class MyWorker extends Worker {...} > public class MyWorker extends Worker {...}
我也有同样的问题。对我来说,问题的原因是我的工人类是嵌套类。当我把它变成一个独立的类时,它就工作了。我的问题是我的kotlin类的构造函数: 错 好
如果您正在使用按需初始化和Dagger注入整个配置,请确保按照。这是唯一帮助我的事情。有关更多详细信息,请查看
如果您将
工人
与希尔特
一起使用,那么,除此之外,请确保您是希尔特工人工厂
的应用程序
类
@HiltAndroidApp
class App: Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}
除此之外:
如果使用Kotlin,另一件要记住的事情是工人类可以嵌套,但不能将其标记为内部
我怀疑,如果您使用的是Java,那么如果您将嵌套类标记为static
,那么也可以使用它。但我还没有测试过这个。@ianhanniballake所以。。。即使不使用proguard限制,也需要添加它?我在1.0.0-beta01中也遇到了同样的问题,而且我的构造函数(我的自定义工作程序)似乎是包私有的。要让workmanager工作,它需要是公共的。我将构造函数公之于众,它就像一个符咒一样工作。在我的例子中,我将class作为默认修饰符,我将它公之于众,并且它工作正常。在android.arch.work:work runtime:1.0.1(android Emulator 9.0)上仍然存在此异常。你升级到1.0.1了吗@2.2.0中的ianhanniballakesame异常也解决了我的问题。添加一个proguard排除没有。thx,救了我一天!仅限独立课!但区别是什么?这是最正确的答案。在WorkManager代码的深处,有一个WorkerFactory接口的实现,它基于上下文和workerParams创建了一个Worker。这对我也很有用!非常有用。更多的解释可以从官方文档中找到,Addstatic
是我在Java中的解决方案。我只需要将上下文
存储在Worker
构造函数中,就可以在doWork()
中重用它。
class MyWorker(val app: Application, workerParams: WorkerParameters): Worker(app, workerParams)
class MyWorker(val context: Context, workerParams: WorkerParameters): Worker(context, workerParams)
<!-- Remove WorkManager default initialization -->
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
@HiltAndroidApp
class App: Application(), Configuration.Provider {
@Inject
lateinit var workerFactory: HiltWorkerFactory
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
}