无法在 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#onCreateContentProvider,之前调用此方法 打电话给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 将添加一个名为WorkerManagerInitializerContentProvider,其权限设置为my-packagename.workermanager-init

如果您在禁用 WorkerManagerInitializer 时在您的清单文件中传递了错误的权限,Android 将无法编译您的清单。

【讨论】:

就是这样!禁用清单中的提供程序更正了问题。感谢赛义德的宝贵帮助。我只是在您的答案中添加了编译代码,我需要在提供程序中的 xml 中添加以下内容:tools:replace="android:authorities",否则将无法编译。 看起来你真的可以做到:android:authorities="$applicationId.workmanager-init"

以上是关于无法在 WorkManager 中设置自定义工人工厂的主要内容,如果未能解决你的问题,请参考以下文章

在TextView中设置文本自定义

在FreeSWITCH中设置视频通话

如何在 ListView 和 AlertDialog 中设置自定义字体?

在android的片段中设置列表视图适配器

在 Google Maps api v2 中设置自定义 InfoWindow 的宽度

在WIX中设置对话框和习惯的顺序