我正在使用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实例?

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

最佳答案

如果您确实确实需要将服务放在单独的进程中,则可以在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)中的一些答案,工作经理仍将使用主流程来进行工作(即使它是从第二个流程调用的)。

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

关于android - 无法从单独的进程启动WorkManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53746097/

10-10 09:44