首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法将dao依赖项传递给android工作管理器构造函数

无法将dao依赖项传递给android工作管理器构造函数
EN

Stack Overflow用户
提问于 2022-09-06 10:59:25
回答 2查看 106关注 0票数 2

我遇到了工作经理的问题。我想将一个dao传递给工作管理器构造函数,并遵循所有的实现,但是无法访问这个dao。

java.lang.NoSuchMethodException: com.itmedicus.pdmderma.worker.DermaWorker.android.content.Context类,androidx.work.WorkerParameters类

工人阶级

代码语言:javascript
运行
复制
    @HiltWorker
    class DermaWorker @AssistedInject constructor(
    @Assisted appContext: Context,
    @Assisted params: WorkerParameters,
    private val dermaDao: DermaDao
    ): CoroutineWorker ( appContext,params)
     {
    override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
    try {
          DamiData.addDermaList()
           val list = DamiData.dermaList
          for (derma in list) {
            dermaDao.insertDermaContent(derma)
        }
        Result.success()

    } catch (ex: Exception) {
        Result.failure()
    }
  }
}

应用类

代码语言:javascript
运行
复制
     @HiltAndroidApp
     class PdmDerma : Application(), Configuration.Provider {
     @Inject
     lateinit var workerFactory: HiltWorkerFactory

    companion object {
    lateinit var appContext: Context
    }

    override fun onCreate() {
    super.onCreate()
    appContext = applicationContext
    plant(Timber.DebugTree())
   }

    override fun getWorkManagerConfiguration(): Configuration {
    return Configuration.Builder().setWorkerFactory(workerFactory)
        .setMinimumLoggingLevel(android.util.Log.DEBUG)
        .build()
  }
}

清单

代码语言:javascript
运行
复制
        <provider
        android:name="androidx.startup.InitializationProvider"
        android:authorities="${applicationId}.androidx-startup"
        android:exported="false"
        tools:node="merge">
        <meta-data
            android:name="androidx.work.WorkManagerInitializer"
            android:value="androidx.startup"
            tools:node="remove" />
       </provider>

HiltWorkerModule

代码语言:javascript
运行
复制
       @Module
       @InstallIn(SingletonComponent::class)
       object WorkManagerInitializer : Initializer<WorkManager> {

       @Provides
       @Singleton
       override fun create(@ApplicationContext context: Context): WorkManager {
       val configuration = Configuration.Builder().build()
       WorkManager.initialize(context, configuration)
       return WorkManager.getInstance(context)
    }

      override fun dependencies(): List<Class<out Initializer<*>>> {
      // No dependencies on other libraries.
      return emptyList()
    }
  }

Build.gradle

代码语言:javascript
运行
复制
     //Dagger Hilt
     implementation 'com.google.dagger:hilt-android:2.42'
     kapt 'com.google.dagger:hilt-compiler:2.42'
     kapt 'androidx.hilt:hilt-compiler:1.0.0'
     implementation 'androidx.hilt:hilt-work:1.0.0'
     implementation "androidx.startup:startup-runtime:1.1.1"

     // work manager
     implementation "androidx.work:work-runtime-ktx:2.7.1"
EN

Stack Overflow用户

发布于 2022-09-07 06:38:36

是的我解决了这个问题。我试图从一个viewmodel.In (视图模型构造函数)中插入工作管理器,在这个过程中,我传递的是私有val workmanager : WorkManager.But,在这个过程中,我不能插入我为上下文保留的AndroidViewModel &手动创建工作管理器依赖项。这是我的解题代码。

代码语言:javascript
运行
复制
@HiltViewModel
class DermaViewModel @Inject constructor(
private val dermaRepository: DermaRepository,
application
) : AndroidViewModel(context) {

init {
    initWorkManager()
}

private fun initWorkManager() {
    val request: WorkRequest = OneTimeWorkRequestBuilder<DermaWorker>()
        .build()
    val workManager = WorkManager.getInstance(context)
    workManager.enqueue(request)
 }
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73620884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档