我使用以下代码来设置自己的 worker 工厂:

val daggerWorkerFactory = DaggerWorkerFactory(toInjectInWorker)

val configuration = Configuration.Builder()
        .setWorkerFactory(daggerWorkerFactory)
        .build()

WorkManager.initialize(context, configuration)

执行此代码后,我可以获取WorkManager实例:
val workManager = WorkManager.getInstance()

问题在于,对于在此之后创建的每个工作人员,从未使用过我的工厂。而是使用默认工厂。

我可以在API文档中看到方法“WorkManager.initialize”有一个注释:



我找不到有关如何执行此操作的任何信息。这是在某些较旧版本的WorkManager上,他们忘了从文档中删除吗,或者这真的有必要吗?如果是这样,怎么办?

最佳答案

WorkerManager.initialize()的文档



因此,您需要在 list 文件中禁用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将添加一个名为ContentProviderWorkerManagerInitializer,其权限设置为my-packagename.workermanager-init

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

关于android - 无法在WorkManager中设置自定义 worker 工厂,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52700557/

10-09 04:06