マーティンZeitler氏:
これらの依存関係を持ちます:
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)
。
目的は、(ログ・レベルを変更するために)手動初期化中にクラッシュを防止することです。無効にする方法WorkManagerInitializer
?可能であれば、私が使用したくないstatic
キーワードを。
マーティンZeitler氏:
これは、プロバイダを代用する方法ですandroidx.work.impl.WorkManagerInitializer
。
<application>
...
<!-- disable default provider -->
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
android:exported="false"
android:enabled="false"/>
<!-- register custom provider -->
<provider
android:name=".CustomWorkManagerInitializer"
android:authorities="${applicationId}.WorkManagerInit"/>
</application>
出典:カスタムワークマネージャの初期化(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;
}
...
}