Android WorkManager自定义Worker注入参数报错:无法创建Worker
WorkManager结合自定义WorkerFactory创建带参数Worker时抛出NoSuchMethodException异常
运行时持续抛出以下异常:
Could not instantiate doddlecore.orders.workmanager.OrdersSyncWorker java.lang.NoSuchMethodException: doddlecore.orders.workmanager.OrdersSyncWorker.<init> [class android.content.Context, class androidx.work.WorkerParameters] at java.lang.Class.getConstructor0(Class.java:2363) at java.lang.Class.getDeclaredConstructor(Class.java:2201) at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:95) at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:243) at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:145) at androidx.work.impl.utils.SerialExecutorImpl$Task.run(SerialExecutorImpl.java:96) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) at java.lang.Thread.run(Thread.java:1012)
我的代码如下:
Android清单文件
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" android:multiprocess="true" tools:node="merge"> <!-- If you are using androidx.startup to initialize other components --> <meta-data android:name="androidx.work.impl.WorkManagerInitializer" android:value="androidx.startup" tools:node="remove" /> </provider>
Application类
@Override public androidx.work.Configuration getWorkManagerConfiguration() { DelegatingWorkerFactory factory = new DelegatingWorkerFactory(); factory.addFactory(new MyWorkerFactory(orderRepository)); return new androidx.work.Configuration.Builder() .setMinimumLoggingLevel(android.util.Log.INFO) .setWorkerFactory(factory) .build(); }
Worker类
class OrdersSyncWorker( ctx: Context, params: WorkerParameters, private val ordersRepo: IOrderRepository ): CoroutineWorker(ctx, params) { override suspend fun doWork(): Result { return try { ordersRepo.syncOrders() Result.success() } catch (ex: IllegalStateException) { Result.retry() } } }
WorkerFactory类
class MyWorkerFactory(private val orderRepository: IOrderRepository) : WorkerFactory() { override fun createWorker( appContext: Context, workerClassName: String, workerParameters: WorkerParameters ): ListenableWorker? { return when(workerClassName) { OrdersSyncWorker::class.java.name -> OrdersSyncWorker(appContext, workerParameters, orderRepository) else -> // Return null, so that the base class can delegate to the default WorkerFactory. null } } }
我尝试过相关解决方案但均无效,不清楚问题出在哪。另外如果移除自定义参数,仅保留Context和WorkerParameters的构造函数,Worker就能正常运行:
class OrdersSyncWorker( ctx: Context, params: WorkerParameters ): CoroutineWorker(ctx, params) {
内容的提问来源于stack exchange,提问作者srisindhu saride
相关产品推荐
相关产品推荐

