【问题标题】:Workmanager doesn't start when I use HILT使用 HILT 时 Workmanager 不启动
【发布时间】:2021-03-17 13:45:22
【问题描述】:

Hy

我最近将我的项目从 Dagger 2 迁移到 Hilt。一切都很顺利,但是当我修改我的 WorkManager 类时,因为我的工人没有做任何事情。

在 logcat 中我发现了这个错误信息:WM-WorkerFactory: Could not instantiate hu.crm.crmapp.workmanager.SynchronizationWorker java.lang.NoSuchMethodException:hu.crm.crmapp.workmanager.SynchronizationWorker。 [类android.content.Context,类androidx.work.WorkerParameters]

首先,我检查了在 stackoverflow 中找到的所有内容,因此我从清单中删除了 thw workmanager 提供程序。

我也提供了 Sync 和 PrefManager 依赖项,但我不在这里复制那一堆代码。

My Woker class:
@HiltWorker
class SynchronizationWorker @AssistedInject constructor(
    private val sync: Sync,
    private val prefManager: PrefManager,
    @Assisted private val context: Context,
    @Assisted workerParams: WorkerParameters
) : Worker(context, workerParams) {
    private val countDownLatch = CountDownLatch(1)

    override fun doWork(): Result {
        val notificationHelper = NotificationHelper(context)
        var workResult: Result = Result.success()
    //doThings
}

My Application class:
@HiltAndroidApp
class CrmApp : Application(), Configuration.Provider {

    @Inject
    lateinit var workerFactory: HiltWorkerFactory

    @Inject
    lateinit var errorLogDao: ErrorLogDao

    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    override fun onCreate() {
        super.onCreate()

        BuildTypeInitializations.init(this)

    }

    override fun getWorkManagerConfiguration(): Configuration {
        return Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
    }
}

And there is the call of Worker class
val constraint =
                Constraints.Builder()
                    .setRequiredNetworkType(NetworkType.CONNECTED).build()

            val synchronizationWorker =
                OneTimeWorkRequest.Builder(SynchronizationWorker::class.java)
                    .setConstraints(constraint)
                    .setBackoffCriteria(
                        BackoffPolicy.LINEAR,
                        OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                        TimeUnit.MILLISECONDS
                    )
                    .build()

            WorkManager.getInstance(requireContext()).enqueue(synchronizationWorker)

感谢您的帮助。

【问题讨论】:

    标签: android kotlin dagger-hilt


    【解决方案1】:

    当我想用 Dagger-Hilt 在 Workmanager 中注入构造函数参数时,我遇到了同样的问题和错误。按照以下步骤使用 Hilt 在 Workmanager 中注入构造函数参数:

    第 1 步: 从 AndroidManifest.xml 中删除默认初始化程序:

    <application>
      <provider
          android:name="androidx.work.impl.WorkManagerInitializer"
          android:authorities="${applicationId}.workmanager-init"
          tools:node="remove" />
    </application>
    

    (正如你所说,你已经完成了这部分)

    第 2 步:在您的 Application 类中插入以下代码:

    @HiltAndroidApp
    class ImageSearchApplication : Application(), Configuration.Provider{
    
        @Inject lateinit var workerFactory: MyWorkerFactory
    
        override fun getWorkManagerConfiguration() =
            Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.DEBUG)
                .setWorkerFactory(workerFactory)
                .build()
    }
    

    第 3 步: 现在创建一个名为 MyWorkerFactory 的类,如下所示:

    class MyWorkerFactory @Inject constructor (private val repository: UnsplashRepository) : WorkerFactory() {
    
        override fun createWorker(
            appContext: Context,
            workerClassName: String,
            workerParameters: WorkerParameters
        ): ListenableWorker? {
            // This only handles a single Worker, please don’t do this!!
            // See below for a better way using DelegatingWorkerFactory
            return MyWorker(appContext, workerParameters, repository)
    
        }
    }
    

    就是这样!请注意,在 Worker 类中传递和注入您需要的所有参数。我只需要我的存储库,所以我定义并注入了它。

    【讨论】:

    • 感谢您的回答,我会尽快检查。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2022-08-04
    • 2022-11-14
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多