gpt4 book ai didi

android - 当客户端调用 WorkManager.initialize() 时,WorkManager 在库中不起作用

转载 作者:行者123 更新时间:2023-11-29 22:46:31 26 4
gpt4 key购买 nike

我正在编写一个使用 WorkManager 的 Android 库。在代码的某处,我调用了这样的东西:

val uploadTripRequest = OneTimeWorkRequest.Builder(UploadTripWorker::class.java)
.setConstraints(someConstraints)
.setBackoffCriteria(BackoffPolicy.EXPONENTIAL, OneTimeWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
.build()

WorkManager.getInstance(context)
.enqueueUniqueWork(WORKER_NAME, ExistingWorkPolicy.REPLACE, uploadTripRequest)

在我的 build.gradle 中,我有:implementation 'androidx.work:work-runtime:2.2.0'

通常情况下,一切都很完美。当客户端应用程序调用 https://developer.android.com/reference/kotlin/androidx/work/WorkManager.html#initialize 时出现问题,例如:

WorkManager.initialize(context, Configuration.Builder().setWorkerFactory(myWorkerFactory).build())

调用此方法时,我的库中的 WorkManager 未按预期工作。 doWork 方法不是在我的 UploadTripWorker 上调用的,而是在客户端的 myWorkerFactory 提供的 worker 上执行的。

从我的角度来看,WorkManager 在库中是不可用的,因为它是一个单例并且有人可以通过 initialize 方法更改它的行为。但我希望我错了。

有什么办法可以解决这个问题吗?当然,我不能对所有客户说不要使用 WorkManager.initialize() 方法。

最佳答案

WorkManager v2.1 引入了 DelegatingWorkerFactory在这些情况下可以提供帮助的类。

它仍然需要应用程序开发人员以正确的方式实现它,正如您所说的 WorkManager 是单例的。

关键在于,如果应用程序需要自定义初始化和自定义 WorkerFactory,则应使用 DelegatingWorkerFactory 然后是 add它有自己的 WorkerFactory。

这里的关键点是应用程序的 WorkerFactory 应该检查工作类名称以确保它是正确的(通常在构造函数中注入(inject)一些参数)。如果类名不是应用程序所期望的,它可以只返回 null,DelegatingWorkerFactory 将注意找到正确的工作类来实例化。

类似于(在应用程序代码中):

class MyWorkerFactory(
private val myInjectedParam: InjectedParam
) : WorkerFactory() {

override fun createWorker(
appContext: Context,
workerClassName: String,
workerParameters: WorkerParameters
): ListenableWorker? {

return when (workerClassName) {
MyWorker::class.java.name ->
MyWorker(appContext, workerParameters, myInjectedParam)
else ->
// Return null, so that the base class can delegate to the default WorkerFactory.
null
}
}
}

然后应用程序需要将此 WorkerFactory 添加到已设置为自定义 WorkerFactory 的 DelegatingWorkerFactory,使用:

private fun initializeWorkManager (myInjectedParam: MyInjectedParam): WorkManager
{
val appContext = getApplication<MyApplication>()
val factory = appContext.workManagerConfiguration.workerFactory
as DelegatingWorkerFactory
factory.addFactory(MyWorkerFactory(myInjectedParam))

return WorkManager.getInstance(appContext)
}

在应用程序类中你有:

class MainApplication : Application(), Configuration.Provider {

val delegatingWorkerFactory: DelegatingWorkerFactory

// Setup custom configuration for WorkManager with a DelegatingWorkerFactory
override fun getWorkManagerConfiguration(): Configuration {
return Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.INFO)
.setWorkerFactory(delegatingWorkerFactory)
.build()
}
}

关于android - 当客户端调用 WorkManager.initialize() 时,WorkManager 在库中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58343759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com