WorkManager 初始化异常排查

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.

三种初始化方式

  1. 显示调用init

  2. 实现Configuration.Provider 接口,getInstance传入context ,此时内部会显示调用init

  3. 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容