簡體   English   中英

WorkManager - 當我們同時使用默認初始化和自定義初始化時,我們是否應該刪除默認初始化程序?

[英]WorkManager - Should we remove the default initializer, when we use both Default initialization and Custom initialization?

當我將 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.1.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類為空時,似乎也很少有機會執行“默認初始化”( WorkManager.getInstance() )。

通過包含以下provider ,我可以輕松消除 APK 導出過程中的錯誤。 但是,這樣做是對的嗎?

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

我們在 WorkManager 2.3.0-*引入了這個 lint 規則。 我們試圖通過此 Lint 規則解決的問題是,如果您同時擁有WorkManagerInitializer ContentProvider並且您的Application子類型實現了Configuration.Provider (用於按需初始化) - ContentProvider始終優先。

這可能出乎意料,尤其是當您有額外的Configuration不會生效時,因為ContentProvider始終使用默認配置。

您真正需要做的就是刪除默認提供程序。 這樣初始化將不再是急切的,而是按需進行的。

是的,如果您想使用按需初始化,您需要刪除默認的工作管理器初始化程序,因此請在清單中保留以下代碼:

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

此外,上述文檔明確指出您不應調用WorkManager.getInstance() (沒有Context參數):

注意:如果在 WorkManager 初始化之前調用已棄用的無參數 WorkManager.getInstance() 方法,該方法將引發異常。 您應該始終使用 WorkManager.getInstance(Context) 方法,即使您沒有自定義 WorkManager。

查看 androix/work 更新日志后,您會看到在2.3.0-beta02版本中添加了一個新功能:

  • 添加了 lint 規則,以確保在使用按需初始化時從 AndroidManifest.xml 中刪除內容提供程序 androidx.work.impl.WorkManagerInitializer。 ( aosp/1167007 )

從版本 2.2.0 升級到 2.3.0.rc1 后出現此錯誤的原因是,android 團隊添加了一個RemoveWorkManagerInitializerDetector ,它會在構建時拋出您在以下拉取請求中遇到的異常。

現在關於源代碼,我建議您將getWorkManager方法直接與應用程序緊密getWorkManager ,如下所示:

import androidx.annotation.NonNull;
import androidx.work.Configuration;
import androidx.work.WorkManager;

public class App extends MultiDexApplication implements Configuration.Provider {
    private static App APP_INSTANCE;

    @Override
    public void onCreate() {
        super.onCreate();
        APP_INSTANCE = this;
    }

    public static App getInstance() {
        return APP_INSTANCE;
    }

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

    public static WorkManager getWorkManager() {
        return WorkManager.getInstance(APP_INSTANCE);
    }
}

只要您需要在應用程序源代碼中調用App.getWorkManager()

如果有的話,您可以為您的 ContentProvider 做一些等效的事情。

PS:有趣的 codelabs 教程退出javakotlin

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());
        ...
    }
    ...
}

如果您在更新到WorkManager 2.6.0 或更高版本后收到此錯誤,則必須在清單中使用此代碼段:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">

    <meta-data
        android:name="androidx.work.WorkManagerInitializer"
        android:value="androidx.startup"
        tools:node="remove" />

</provider>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM