web-dev-qa-db-ja.com

WorkManager-デフォルトの初期化とカスタムの初期化の両方を使用する場合、デフォルトの初期化子を削除する必要がありますか?

WorkManagerを「2.2.0」から「2.3.0-rc01」にアップグレードすると、次の新しいエラーが発生します

APKをエクスポートするとエラーが発生します。

_C:\app: Error: Remove androidx.work.impl.WorkManagerInitializer from your AndroidManifest.xml when using on-demand initialization. [RemoveWorkManagerInitializer]

   Explanation for issues of type "RemoveWorkManagerInitializer":
   If an Android.app.Application implements
   androidx.work.Configuration.Provider,
   the default androidx.work.impl.WorkManagerInitializer needs to be removed
   from the
   AndroidManifest.xml file.
_

2.2.0で「オンデマンド初期化」が導入されたため、2.2.0でこのようなエラーが発生しなかった理由がわかりません。

によると https://developer.Android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#remove-default

_AndroidManifest.xml_に以下を含めるのが正しいことかどうか、私にはよくわかりません。

_<provider
    Android:name="androidx.work.impl.WorkManagerInitializer"
    Android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />
_

現在、以下は私のApplicationクラスです。

MyApplicationクラス

_public class MyApplication extends MultiDexApplication implements Configuration.Provider {
    private static MyApplication me;

    @Override
    public void onCreate() {
        super.onCreate();

        me = this;
    }

    public static MyApplication instance() {
        return me;
    }

    @NonNull
    @Override
    public Configuration getWorkManagerConfiguration() {
        return new Configuration.Builder()
                .build();
    }
}
_

WorkManagerの作成方法

_public static WorkManager getWorkManager() {
    MyApplication myApplication = MyApplication.instance();
    if (myApplication == null) {
        // Very rare Edge case. Not sure how it happens. But, it happens :)
        return WorkManager.getInstance();
    } else {
        return WorkManager.getInstance(myApplication);
    }
}
_

Applicationクラスがnullの場合、「デフォルトの初期化」(WorkManager.getInstance())も実行されている可能性はほとんどありません。

次のproviderを含めることで、APKエクスポート中のエラーを簡単に排除できます。しかし、そうすることは正しいことでしょうか?

_<provider
    Android:name="androidx.work.impl.WorkManagerInitializer"
    Android:authorities="${applicationId}.workmanager-init"
    tools:node="remove" />
_
7
Cheok Yan Cheng

このlintルールはWorkManager 2.3.0-*で導入されました。このLintルールで対処しようとしている問題は、WorkManagerInitializerContentProviderApplicationサブタイプの両方がConfiguration.Provider(オンデマンド初期化用)を実装している場合、ContentProvideralways取るということです。優先。

これは、特にConfigurationalwaysがデフォルトの構成を使用するためにされないが有効になる追加のContentProviderがある場合、特に予期しない可能性があります。

本当に必要なのは、デフォルトのプロバイダーを削除することだけです。そうすれば、初期化は熱心ではなくなり、オンデマンドになります。

1
Rahul

WorkManagerInitializerは、WorkManagerにコンテキストを提供するために使用されます。これは、コンテンツプロバイダーがApplicationの前に初期化されるために発生します( この質問 を参照)。これが、カスタム初期化を行う場合にコンテキストを自分で提供する必要がある理由です。したがって、カスタム初期化を使用する場合、それは必要ありません。

コンテンツプロバイダー からgetWorkManagerメソッドを呼び出す場合、アプリケーションインスタンスはnullになります。この問題を解決するには、コンテンツプロバイダー内でgetContextを呼び出して、コンテキストをパラメーターとしてメソッドに渡します。

public static WorkManager getWorkManager(Context context) {
    return WorkManager.getInstance(context);
}
public class MyContentProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        WorkManager workManager = getWorkManager(getContext());
        ...
    }
    ...
}
0
Sir Codesalot