无法从单独的进程启动WorkManager

时间:2018-12-12 15:17:06

标签: android android-jetpack android-workmanager

我正在使用WorkManager库(版本:1.0.0-alpha12)。在我的应用中,我正在使用AndroidManifest中的以下xml行创建一个新流程。

android:process=":myprocess"

这是我使用WorkManager的方式:

 public static void startCheckStatusWorker() {
    WorkManager manager = WorkManager.getInstance();
    String uniqueName = "check_status_worker";
    PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest.Builder(CheckStatusWorker.class, 1, TimeUnit.DAYS);
    builder.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
    PeriodicWorkRequest request = builder.build();
    manager.enqueueUniquePeriodicWork(uniqueName, ExistingPeriodicWorkPolicy.KEEP, request);
 }

但是当我从新进程中调用此方法时,应用程序将崩溃。这是抛出的异常,

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.
at androidx.work.WorkManager.getInstance(WorkManager.java:139)

如果我调用相同的方法,则在正常的应用程序过程中它可以正常工作,并且不会按我的建议在应用程序清单中禁用WorkManagerInitializer。

是否可以从新流程中获取WorkManager实例?

任何建议将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:1)

如果您确实真的需要将服务放在单独的进程中,则可以在AndroidManifest中禁用WorkManagerInitializer。 像这样:

<provider
    android:name="androidx.work.impl.WorkManagerInitializer"
    android:authorities="com.sample.workmanager-init"
    android:enabled="false"/>

禁用它后,在您的Application类中(如果您没有该类,则应该创建自己的类并扩展android Application类),然后调用WorkManager.initialize()。

那为我解决了。

但是请注意,根据google问题论坛(https://issuetracker.google.com/issues/79993883)中的一些答案,工作经理仍将使用主流程来进行工作(即使它是从第二个流程中调用的)。 / p>

我推荐什么?如果将服务放在非主进程上并没有太大的优势,则应该使服务位于主进程上,因为这样很难维护(例如,静态全局变量将有两个实例,每个实例一个)过程)