[英]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.