具有以下依赖性:
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
关键字。
答案 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中,因此只能调用一次。之后,只有在需要时才能获得实例,而无需担心。不建议初始化工作者管理器。你为什么需要那个?