![](/img/trans.png)
[英]How can I use my ApiService and Room Dao into WorkManager with Hilt, implementing MVVM pattern?
[英]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.