java.lang.IllegalStateException:WorkManager 已经初始化。即使工作管理器未初始化

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:WorkManager 已经初始化。即使工作管理器未初始化【英文标题】:java.lang.IllegalStateException: WorkManager is already initialized. Even though work manager is not initialized 【发布时间】:2021-05-24 17:41:54 【问题描述】:

我正在尝试进行自定义工作管理器初始化。我不希望工作经理一开始就被初始化,我只想在登录成功时才初始化。但即使工作管理器未初始化,我总是会遇到以下异常:

java.lang.IllegalStateException: WorkManager is already initialized.  Did you try to initialize it manually without disabling WorkManagerInitializer? See WorkManager#initialize(Context, Configuration) or the class level Javadoc for more information.

以下是我的清单文件,我已禁用工作管理器的默认初始化:

 <provider
            tools:node="remove"
            android:name="androidx.work.impl.WorkManagerInitializer"
            android:authorities="$applicationId.workmanager-init"
            android:exported="false"
            android:enabled="false"/>

下面是我的应用类,我已经实现了Configuration.Provider:

open class MyApplication : Application(), Configuration.Provider 

override fun onCreate() 
        super.onCreate()
 daggerComponent = DaggerApplicationComponent.builder().application(this).build()
    


  override fun getWorkManagerConfiguration(): Configuration 
        val factory: AppWorkerFactory = daggerComponent?.factory()!!
       return Configuration.Builder()
            .setMinimumLoggingLevel(android.util.Log.INFO)
            .setExecutor(appExecutors.upload).setWorkerFactory(factory)
            .build()
    

如果登录成功,我正在尝试在 LoginFragment 中初始化工作管理器,如下所示:

WorkManager.initialize(activity?.application as MyApplication, (activity?.application as MyApplication).workManagerConfiguration)

请让我知道我缺少什么以及为什么我无法在登录片段中初始化工作管理器,我还没有在任何其他地方初始化工作管理器,但为什么我仍然得到工作管理器已经初始化的异常?

【问题讨论】:

这可能有助于***.com/a/55875560/3159267 @rajan.kali 我已经尝试过了,在自定义类中我不确定如何访问应用程序类来初始化工厂 我已经添加了一个答案来访问你在内容提供者中的应用程序类 为什么在覆盖 getWorkManagerConfiguration() 时手动调用 initialize 以提供自动初始化配置? @ianhanniballake 我觉得它必须调用初始化,因为它在文档中提到它是不需要的? 【参考方案1】:

如果您通过让应用程序实现Configuration.Provider 并覆盖getWorkManagerConfiguration() 来实现On Demand Initialization,那么您不需要 需要手动调用initialize - 这正是按需初始化为你做事。

【讨论】:

【参考方案2】:

您可以在ContentProvider 中使用context.applicationContext 来获取Application 类,如

class WorkManagerInit : ContentProvider 
    override fun onCreate() : Boolean
        context?.let 
            val myApp = context.applicationContext as MyApplication
            WorkManager.initialize(myApp, myApp.getWorkManagerConfiguration())
        
        return true
    

【讨论】:

我试过这个当我尝试访问工作管理器配置时得到空指针` 原因是:kotlin.KotlinNullPointerException at .MyApplication.getWorkManagerConfiguration` 我猜你可以使用方法而不是变量,检查更新的答案

以上是关于java.lang.IllegalStateException:WorkManager 已经初始化。即使工作管理器未初始化的主要内容,如果未能解决你的问题,请参考以下文章