IllegalStateException:WorkManager已经初始化

时间:2019-04-26 21:36:35

标签: java android illegalstateexception androidx android-workmanager

具有以下依赖性:

dependencies {
    implementation "androidx.work:work-runtime:2.0.1"
    androidTestImplementation "androidx.work:work-testing:2.0.1"
}

第二次运行此代码时:

Configuration config = new Configuration.Builder().build();
WorkManager.initialize(getApplicationContext(), config);

this.workManager = WorkManager.getInstance();

我收到此错误消息:

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.

并且还会在本机端抛出分段错误:

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR),
fault addr 0x878 in tid 10892 (ova.workmanager),
pid 10892 (ova.workmanager)

这将是WorkManager#initialize(Context, Configuration)的{​​{3}}。


目的是为了防止在手动初始化过程中崩溃(以更改日志级别)。如何禁用WorkManagerInitializer?如果可能的话,我不想使用static关键字。

4 个答案:

答案 0 :(得分:3)

这是替代提供商RewriteEngine on RewriteRule ^script/(.*)$ script.php?id=$1 [L] 的方法:

androidx.work.impl.WorkManagerInitializer

来源:Custom Work Manager initialization(在科特林)。


除非注册其他提供者,否则将给出:

<application>
    ...

    <!-- disable default provider -->
    <provider
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="com.packagename.workmanager-init"
        android:exported="false"
        android:enabled="false"/>

    <!-- register custom provider -->
    <provider
        android:name=".CustomWorkManagerInitializer"
        android:authorities="com.packagename.WorkManagerInit"/>

</application>

java.lang.IllegalStateException: WorkManager is not initialized properly. The most likely cause is that you disabled WorkManagerInitializer in your manifest but forgot to call WorkManager#initialize in your Application#onCreate or a ContentProvider. 中注册的ContentProvider

src/debug/Manifest.xml

答案 1 :(得分:1)

您可以控制何时调用workManager

if(this.workManager == null){
   Configuration config = new Configuration.Builder().build();
   WorkManager.initialize(getApplicationContext(), config);
   this.workManager = WorkManager.getInstance();
}

答案 2 :(得分:1)

WorkManager是单例,在使用前需要进行配置,并且您必须先重新启动应用程序才能更改其配置。

第二次初始化调用将引发异常,以指示如果WorkManager已经初始化,则无法使用该配置。这是在最初的Alpha版本中做出的一项设计决策,以避免无提示地失败(workmanager-1.0.0-alpha11)。

WorkManager v2.1添加了一种按需方式初始化库,因此您可以将实际的初始化从应用程序的热启动顺序中移出。但是,您仍然受到限制,只能对WorkManager进行一次配置。

使用新的按需配置,您必须像下面这样在应用程序中添加一个Configuration.Provider接口:

class MyApplication : Application(), Configuration.Provider {

   override fun getWorkManagerConfiguration(): Configuration =
       // provide custom configuration
       Configuration.Builder()
               .setMinimumLoggingLevel(android.util.Log.INFO)
               .setWorkerFactory(MyWorkerFactory())
               .build()
}

然后,当您需要使用WorkManager而不是使用WorkManager#getInstance()(现已不推荐使用)时,应使用新的:

WorkManager#getInstance(context)

在这种情况下,使用getInstance方法检查WorkManager是否已初始化。如果尚未初始化,它将使用getWorkManagerConfiguration()方法检索配置,然后初始化WorkManager。这样一来,您就不必再致电WorkManager#initialize()来完全避免问题了。

official documentation已使用这些附加详细信息进行了更新。

如果您认为WorkManager在初始化后应允许更新其配置,则应向library's issue tracker添加功能请求。

答案 3 :(得分:0)

如果要初始化WorkerManager,则必须将其放入自定义Application类的onCreate中,因此只能调用一次。之后,只有在需要时才能获得实例,而无需担心。不建议初始化工作者管理器。你为什么需要那个?