在工作管理器的工作线程中注入存储库



用例:我需要从用户那里获得反馈,将其保存在持久存储中,在本例中为Room。每 X 分钟后,我想将这些存储的FeedbackRequest发送到后端。

解决方案:我想使用WorkManager,因为此操作应该在进程死亡中幸存下来,并且也会定期触发。我需要从 Room DB 获取FeedbackRequest列表并使用 Retrofit 客户端将每个FeedbackRequest发送到后端。

问题定义FeedbackRequestRepository负责获取FeedbackRequest列表,在 WorkManager 的doWork()方法中需要从房间 DB 获取数据。另外,我对Dagger2很陌生。打开应用程序后,我收到上述错误。

应用组件代码片段

interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
fun inject(scFeedbackApp: ScFeedbackApp)
fun inject(dispatchWorker: DispatchWorker)

}

存储库代码片段

@Singleton
class FeedbackRequestRepository @Inject constructor(
private val appExecutors: AppExecutors,
private val db: ScFeedbackDB,
private val feedbackAcknowledgeDao: FeedbackRequestDao,
private val scFeedbackFeedbackService: SCFeedbackService
) {
...
}

工作线程代码段

class DispatchWorker @Inject constructor(context:Context,
workerParameters: WorkerParameters,
var feedbackRequestRepository: FeedbackRequestRepository):
Worker(context, workerParameters){
init {
DaggerAppComponent.builder().application(context.applicationContext as ScFeedbackApp)
.build().inject(this)
}
override fun doWork(): Result {
...
}

错误

E/WorkerFactory: Could not instantiate com.scfeedback.service.responseDispatcher.DispatchWorker
java.lang.NoSuchMethodException: <init> [class android.content.Context, class androidx.work.WorkerParameters]
at java.lang.Class.getConstructor(Class.java:528)
at java.lang.Class.getDeclaredConstructor(Class.java:507)
at androidx.work.WorkerFactory.createWorkerWithDefaultFallback(WorkerFactory.java:85)
at androidx.work.impl.WorkerWrapper.runWorker(WorkerWrapper.java:188)
at androidx.work.impl.WorkerWrapper.run(WorkerWrapper.java:124)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
E/WorkerWrapper: Could not create Worker com.scfeedback.service.responseDispatcher.DispatchWorker
  1. 这与依赖关系注入设置有关吗?
  2. 如果没有,那我哪里错了。

您的方法存在两个问题:

  • 不能同时应用构造函数注入@inject constructor(...)和直接注入DaggerAppComponent...inject(this)
  • 必须使用默认构造函数:

因此,您可以将DispatchWorker更改为:

class DispatchWorker constructor(context:Context,
workerParameters: WorkerParameters):
Worker(context, workerParameters){
@Inject  lateinit var feedbackRequestRepository: FeedbackRequestRepository
init {
DaggerAppComponent.builder().application(context.applicationContext as ScFeedbackApp)
.build().inject(this)
}
override fun doWork(): Result {
...
}

或使用自定义工人工厂

最新更新