无法在 WorkManager 中设置自定义工人工厂
Posted
技术标签:
【中文标题】无法在 WorkManager 中设置自定义工人工厂【英文标题】:Unable to set a custom worker factory in WorkManager 【发布时间】:2019-03-13 00:34:09 【问题描述】:我使用这段代码来设置我自己的工人工厂:
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
这段代码执行后,我可以得到WorkManager实例:
val workManager = WorkManager.getInstance()
问题是,在此之后创建的每个工人,我的工厂都从未使用过。而是使用默认工厂。
我可以在 API 文档中看到方法“WorkManager.initialize”有一个注释:
在清单中禁用 androidx.work.impl.WorkManagerInitializer
我找不到有关如何执行此操作的任何信息。这是在某些旧版本的 WorkManager 上,他们忘记从文档中删除还是真的有必要?如果有,怎么做?
【问题讨论】:
见developer.android.com/topic/libraries/architecture/workmanager/… 【参考方案1】:来自WorkerManager.initialize()
的文档
默认情况下,不应调用此方法,因为
WorkManager
是 自动初始化。要自己初始化WorkManager
,请 请按照以下步骤操作:在清单中禁用
androidx.work.impl.WorkManagerInitializer
Application#onCreate
或ContentProvider
,之前调用此方法 打电话给getInstance()
因此,您需要在 Manifest 文件中禁用 WorkManagerInitializer
:
<application
//...
android:name=".MyApplication">
//...
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="your-packagename.workmanager-init"
android:enabled="false"
android:exported="false" />
</application>
在您的自定义Application
类中,初始化您的WorkerManager
:
class MyApplication : Application()
override fun onCreate()
super.onCreate()
val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)
val configuration = Configuration.Builder()
.setWorkerFactory(daggerWorkerFactory)
.build()
WorkManager.initialize(context, configuration)
注意:
默认情况下,WorkerManager
将添加一个名为WorkerManagerInitializer
的ContentProvider
,其权限设置为my-packagename.workermanager-init
。
如果您在禁用 WorkerManagerInitializer
时在您的清单文件中传递了错误的权限,Android 将无法编译您的清单。
【讨论】:
就是这样!禁用清单中的提供程序更正了问题。感谢赛义德的宝贵帮助。我只是在您的答案中添加了编译代码,我需要在提供程序中的 xml 中添加以下内容:tools:replace="android:authorities",否则将无法编译。 看起来你真的可以做到:android:authorities="$applicationId.workmanager-init"
以上是关于无法在 WorkManager 中设置自定义工人工厂的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ListView 和 AlertDialog 中设置自定义字体?