Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓系统工作经理:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;无法实例化Worker";_Android_Androidx_Android Workmanager - Fatal编程技术网

Android 安卓系统工作经理:“您必须遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他有关法律法规。”;无法实例化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> []

我遵循了使用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> []
        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。这对我也很有用!非常有用。更多的解释可以从官方文档中找到,Add
static
是我在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()
}