WorkManager is already initialized
在APP挂monkey大量报错
java.lang.IllegalStateException: WorkManager is already initialized.
Did you try to initialize it manually without disabling WorkManagerInitializer?
See WorkManager#initialize(Context, Configuration) or the class level Javadoc for more information.
三种初始化方式
显示调用init
实现Configuration.Provider 接口,getInstance传入context ,此时内部会显示调用init
WorkManagerInitializer 自动初始化,实际上也是显示调用init
报错的三方SDK操作思路:屏蔽自动初始化,显示调用
分析发现由于我们接入的三方SDK 移除了WorkManagerInitializer,所以自己的主APP也需要自己初始化
最开始主APP并没有手动去初始化,但接入这个三方SDK后,开始报错
WorkManager is not initialized properly
提示没有正确初始化,那此时只能被迫也手动初始化了,且选择的初始化方式2通过
workmanager
源码分析能看到,当使用方式2,首先调用getInstance
那么就相当于初始化了,而某一刻xxxSDK又去手动调用初始化操作,此时就会报错,提示已经初始化过了如果先调用的是init手动初始化,此时即使调用
getInstance
也不会有问题,因为方式2 此时并不会再去初始化,判断实例已经存在。
小结
总结下这个问题,当多个module或者多个进程都要使用workmanager
,如何才能确保正确的初始化?
源码中初始化有两处异常抛出:
WorkManager is already initialized
WorkManager is not initialized properly
由于该组件同一个进程只能初始化一次,必须要约定好。建议如果自己module选择了手动初始化,请记得捕获异常。
拓展: 多进程使用 workmanager
https://juejin.cn/post/7002086910331977736
https://segmentfault.com/a/1190000039267768