Невозможно запустить WorkManager из отдельного процесса - PullRequest
0 голосов
/ 12 декабря 2018

Я использую библиотеку WorkManager (версия: 1.0.0-alpha12).В моем приложении я создаю новый процесс, используя следующую строку XML в AndroidManifest.

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 голосов
/ 19 декабря 2018

Если вам ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО требуется, чтобы служба находилась в отдельном процессе, вы можете отключить WorkManagerInitializer в AndroidManifest.Идет примерно так:

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

После его отключения в своем классе Application (если у вас его нет, вы должны создать свой собственный и расширить класс приложения Android) и вызвать WorkManager.initialize ()..

Это исправило это для меня.

Но учтите, что согласно некоторым ответам на форумах по проблемам Google (https://issuetracker.google.com/issues/79993883), рабочий менеджер по-прежнему будет использовать основной процесс в порядкевыполнять работу (даже если она вызывается из второго процесса).

Что я рекомендую? Если нет серьезного преимущества от службы в неосновном процессе, вам просто нужно включить службуосновной процесс, поскольку его будет сложнее поддерживать (например, статические глобальные переменные будут иметь два экземпляра, по одному для каждого процесса)

...