简体   繁体   中英

Workmanager doesn't start when I use HILT

Hy

I recently migarted my projekt from dagger 2 to Hilt. Everything went well, but when I modified my WorkManager class, since my worker hasn't done anything.

In logcat I found this error message: WM-WorkerFactory: Could not instantiate hu.crm.crmapp.workmanager.SynchronizationWorker java.lang.NoSuchMethodException: hu.crm.crmapp.workmanager.SynchronizationWorker. [class android.content.Context, class androidx.work.WorkerParameters]

First of all, I checked all of things, that I found in stackoverflow, so I deleted thw workmanager provider from manifest.

The Sync,and PrefManager dependies I also provided, but I don't copy that bunch of code here.

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)

Thanks for the help.

I encountered the same problem and error when I wanted to inject constructor parameters in the Workmanager with the Dagger-Hilt. Follow these steps to inject constructor parameters in the Workmanager with Hilt:

Step 1: Remove the default initializer from the AndroidManifest.xml:

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

(As you've stated, you have already done this part)

Step 2: In your Application class insert this code:

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

    @Inject lateinit var workerFactory: MyWorkerFactory

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

Step 3: Now create this class called MyWorkerFactory like this:

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)

    }
}

That's it, Note that. pass and inject all the parameters you need in the Worker class. I needed only my repository so I defined and injected it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM