IllegalStateException:WorkManager已初始化

问题描述 投票:1回答:4

拥有这些依赖项:

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)

这将是documentationWorkManager#initialize(Context, Configuration)


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

java android illegalstateexception androidx android-workmanager
4个回答
3
投票

这是如何替代提供商androidx.work.impl.WorkManagerInitializer

<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>

资料来源:Custom Work Manager initialization(在Kotlin)。


除非注册其他提供商,否则会给出:

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.

并且ContentProvidersrc/debug/Manifest.xml注册:

public class WorkManagerInit extends ContentProvider {

    @Override
    public boolean onCreate() {
        if(getContext() != null) {
            Configuration config = new Configuration.Builder().build();
            WorkManager.initialize(getContext().getApplicationContext(), config);
        }
        return true;
    }
    ...
}

2
投票

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()(现已弃用)时,您应该使用new:

WorkManager#getInstance(context)

在这种情况下,getInstance方法检查WorkManager是否已经初始化。如果它尚未初始化,它将使用getWorkManagerConfiguration()方法检索配置,然后初始化WorkManager。通过这种方式,你不再调用WorkManager#initialize()完全避免这个问题。

official documentation已经更新了这些额外的细节。

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


1
投票

您可以控制何时调用workManager

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.