使用 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。 [class android.content.Context, class androidx.work.WorkerParameters]
首先,我检查了在 Whosebug 中找到的所有内容,因此我从清单中删除了 workmanager 提供程序。
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 中传递并注入你需要的所有参数。我只需要我的存储库,所以我定义并注入了它。
嗨
我最近将我的项目从 dagger 2 迁移到了 Hilt。一切顺利,但是当我修改我的 WorkManager class,因为我的工人什么也没做。
在 logcat 中,我发现了这个错误消息:WM-WorkerFactory:无法实例化 hu.crm.crmapp.workmanager.SynchronizationWorker java.lang.NoSuchMethodException:hu.crm.crmapp.workmanager.SynchronizationWorker。 [class android.content.Context, class androidx.work.WorkerParameters]
首先,我检查了在 Whosebug 中找到的所有内容,因此我从清单中删除了 workmanager 提供程序。
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 中传递并注入你需要的所有参数。我只需要我的存储库,所以我定义并注入了它。