使用 HILT 时 Workmanager 不启动

Workmanager doesn't start when I use HILT

我最近将我的项目从 dagger 2 迁移到了 Hilt。一切顺利,但是当我修改我的 WorkManager class,因为我的工人什么也没做。

在 logcat 中,我发现了这个错误消息:WM-WorkerFactory:无法实例化 hu.crm.crmapp.workmanager.SynchronizationWorker java.lang.NoSuchMethodException:hu.crm.crmapp.workmanager.SynchronizationWorker。 [class android.content.Context, class androidx.work.WorkerParameters]

首先,我检查了在 Whosebug 中找到的所有内容,因此我从清单中删除了 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)

感谢您的帮助。

我想用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 步: 在您的申请中 class 插入此代码:

@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,如下所示:

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 class 中传递并注入你需要的所有参数。我只需要我的存储库,所以我定义并注入了它。