簡體   English   中英

使用 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。 [類 android.content.Context,class androidx.work.WorkerParameters]

首先,我檢查了在 stackoverflow 中找到的所有內容,因此我從清單中刪除了 thw workmanager provider。

我也提供了 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 中傳遞並注入您需要的所有參數。 我只需要我的存儲庫,所以我定義並注入了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM