简体   繁体   English

使用 HILT 时 Workmanager 不启动

[英]Workmanager doesn't start when I use HILT

Hy

I recently migarted my projekt from dagger 2 to Hilt.我最近将我的项目从 Dagger 2 迁移到 Hilt。 Everything went well, but when I modified my WorkManager class, since my worker hasn't done anything.一切都很顺利,但是当我修改我的 WorkManager class 时,因为我的工人没有做任何事情。

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.在 logcat 中,我发现此错误消息:WM-WorkerFactory:无法实例化 hu.crm.crmapp.workmanager.SynchronizationWorker java.lang.NoSuchMethodException:hu.crm.crmapp.workmanager.SynchronizationWorker。 [class android.content.Context, class androidx.work.WorkerParameters] [类 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.首先,我检查了在 stackoverflow 中找到的所有内容,因此我从清单中删除了 thw workmanager provider。

The Sync,and PrefManager dependies I also provided, but I don't copy that bunch of code here.我也提供了 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)

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.当我想用 Dagger-Hilt 在 Workmanager 中注入构造函数参数时,我遇到了同样的问题和错误。 Follow these steps to inject constructor parameters in the Workmanager with Hilt:按照以下步骤使用 Hilt 在 Workmanager 中注入构造函数参数:

Step 1: Remove the default initializer from the AndroidManifest.xml:第 1 步:从 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:第 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()
}

Step 3: Now create this class called MyWorkerFactory like this:第 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)

    }
}

That's it, Note that.就是这样,注意。 pass and inject all the parameters you need in the Worker class.在 Worker class 中传递并注入您需要的所有参数。 I needed only my repository so I defined and injected it.我只需要我的存储库,所以我定义并注入了它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我如何使用我的 ApiService 和 Room Dao 到带有 Hilt 的 WorkManager 中,实现 MVVM 模式? - How can I use my ApiService and Room Dao into WorkManager with Hilt, implementing MVVM pattern? 无法使用 @WorkerInject 在 WorkManager 中注入 @Binds Hilt 依赖项 - Couldn't inject @Binds Hilt Dependencies in WorkManager using @WorkerInject 为什么在 Android Studio 项目中使用 Hilt 作为 DI 时无法启动 viewModel() 两次? - Why can't I launch viewModel() two times when I use Hilt as DI in an Android Studio project? 当客户端调用 WorkManager.initialize() 时,WorkManager 在库中不起作用 - WorkManager doesn't work in library when client calls WorkManager.initialize() 使用 Workmanager 的 Hilt Instrumentation 测试不起作用 - Hilt Instrumentation test with Workmanager not working 使用 Hilt 和 WorkManager 进行仪器测试 - Instrumentation Tests using Hilt and WorkManager 使用自定义初始化程序和 Hilt 测试 WorkManager - Testing WorkManager with custom initializer and Hilt 无法使用 Hilt 注入 workmanager 构造函数 - Can not inject workmanager constructor with Hilt 当用户不再使用活动时,如何启动该活动 - How do I start the an activity when user doesn't use it anymore 何时使用 JobIntentService 与 WorkManager? - When to use JobIntentService vs WorkManager?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM