Android工作管理器工厂仅返回一种类型的worker

问题描述 投票:0回答:1

我的应用程序中有 2 个 workManager 工作人员。我为数据库操作DatabaseSyncWorker添加了一个新的worker。数据库同步工作线程需要一个额外的参数作为 DI 的一部分。所以我创建了一个workerFactory类来注入额外的参数。但现在每次我调用任何其他工作人员时,我只获得 DatabaseSyncWorker 实例。如何获取其他worker的实例?我在不同的时间点调用它们。他们是相互独立的

My Factory
class DBSyncWorkerFactory @Inject constructor(private val dao: Dao): WorkerFactory() {
    override fun createWorker(
        appContext: Context,
        workerClassName: String,
        workerParameters: WorkerParameters
    ): ListenableWorker = PolicyWorker(dao, appContext, workerParameters)

}

我的 DB Worker 的 WorkManager 初始化

WorkManager.getInstance(App.context).enqueueUniqueWork(
                tag,
                ExistingWorkPolicy.APPEND,
                OneTimeWorkRequestBuilder<DBSyncWorker>().build
            )

我的networkSyncWorker的workmanager初始化

WorkManager.getInstance(App.context).enqueueUniqueWork(
                tag,
                ExistingWorkPolicy.APPEND,
                OneTimeWorkRequestBuilder<NetworkSyncWorker>().build
            )
android kotlin factory-pattern android-workmanager
1个回答
0
投票

我找到了解决方案。必须使用

workerClassName
来区分类名。解决方法如下

class DBSyncWorkerFactory @Inject constructor(private val dao: Dao): WorkerFactory() {
    override fun createWorker(
        appContext: Context,
        workerClassName: String,
        workerParameters: WorkerParameters
    ): ListenableWorker? {
        return when(workerClassName){
                DBSyncWorker::class.java.name -> DBSyncWorker(dao, appContext, workerParameters)
                NetworkSyncWorker::class.java.name -> NetworkSyncWorker(appContext,workerParameters)
                else ->
                // Null will fall back to the default factory that uses reflection
                    null
            }
    }
© www.soinside.com 2019 - 2024. All rights reserved.