WorkManager 找不到所需的零参数构造函数

WorkManager cannot find required zero-argument constructor

我正在使用 android.arch.work:work-runtime 依赖项中的 WorkManager 1.0.0-alpha02 每隔一分钟查询一次网页(此示例中排除了查询代码,因为它不相关)。

当我这样使用 WorkManager 时:

WorkManager
                .getInstance()
                .enqueue(
                        new PeriodicWorkRequest.Builder(
                                MessageWorker.class,
                                1,
                                TimeUnit.MINUTES
                        )
                                .setConstraints(
                                        new Constraints.Builder()
                                                .setRequiredNetworkType(NetworkType.CONNECTED)
                                                .build()
                                )
                                .build()
                );

private class MessageWorker extends Worker {
        public MessageWorker() {
        }

        @NonNull
        @Override
        public WorkerResult doWork() {
            // Do stuff
            return WorkerResult.SUCCESS;
        }
}

它给出了这个错误信息:

05-31 17:50:05.645 11749-12168/com.neelkamath.webview E/WorkerWrapper: Trouble instantiating com.neelkamath.webview.MainActivity$MessageWorker
    java.lang.InstantiationException: java.lang.Class<com.neelkamath.webview.MainActivity$MessageWorker> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)
        at androidx.work.impl.WorkerWrapper.workerFromClassName(WorkerWrapper.java:405)
        at androidx.work.impl.WorkerWrapper.workerFromWorkSpec(WorkerWrapper.java:377)
        at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:132)
        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)
05-31 17:50:05.645 11749-12168/com.neelkamath.webview E/WorkerWrapper: Could for create Worker com.neelkamath.webview.MainActivity$MessageWorker

我尝试了以下构造函数无济于事:

从 MessageWorker 中删除以下构造函数并使 class public。 :

public MessageWorker() {
}

还要确保 class 在单独的文件中。

您可以在单独的文件中创建 MessageWorker class,如果您想将 MessageWorker class 制作成嵌套 class,您也可以制作它 static

public static class MessageWorker extends Worker {
    @NonNull
    @Override
    public WorkerResult doWork() {
        // Do stuff
        return WorkerResult.SUCCESS;
    }
}

原因是 WorkerWrapper 将通过 clazz.newInstance() 创建您的 worker 实例,并且嵌套 class

没有零参数构造函数