拥有这些依赖项:
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)
这将是documentation的WorkManager#initialize(Context, Configuration)
。
目的是防止手动初始化期间发生崩溃(为了更改日志级别)。如何禁用WorkManagerInitializer
?如果可能,我不想使用static
关键字。
这是如何替代提供商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.
并且ContentProvider
在src/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;
}
...
}
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添加功能请求。
您可以控制何时调用workManager
if(this.workManager == null){
Configuration config = new Configuration.Builder().build();
WorkManager.initialize(getApplicationContext(), config);
this.workManager = WorkManager.getInstance();
}
如果要初始化WorkerManager,则必须将其放在自定义Application类的onCreate中,因此只调用一次。之后,您只能在需要时获得实例而无需担心。建议不要初始化Worker Manager。你为什么需要那个?