我正在使用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实例?
任何建议将不胜感激。 谢谢。
答案 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>
我推荐什么?如果将服务放在非主进程上并没有太大的优势,则应该使服务位于主进程上,因为这样很难维护(例如,静态全局变量将有两个实例,每个实例一个)过程)