Dagger注入WorkManager触发IllegalStateException异常问题求助
WorkManager初始化小概率崩溃问题解决
根因说明
你遇到的IllegalStateException异常是调用WorkManager.getInstance()时,WorkManager尚未完成初始化导致的。2.3.4版本的WorkManager默认依赖内置ContentProvider完成初始化,当应用Dagger组件初始化时机早于该ContentProvider加载流程时就会触发崩溃,小概率出现一般是低性能设备组件加载顺序波动、多进程场景下初始化时序错乱导致。
解决方案
- 方案1:手动控制WorkManager初始化时序
首先在AndroidManifest.xml中禁用默认初始化逻辑:
其次在自定义Application的<provider android:name="androidx.work.impl.WorkManagerInitializer" android:authorities="${applicationId}.workmanager-init" tools:node="remove" />onCreate方法中,先初始化WorkManager再初始化Dagger组件:
原有Dagger提供WorkManager的代码无需改动,即可保证override fun onCreate() { super.onCreate() // 优先初始化WorkManager WorkManager.initialize( this, Configuration.Builder().setMinimumLoggingLevel(Log.INFO).build() ) // 再执行Dagger组件初始化逻辑 // initDagger() }getInstance调用时实例已经初始化完成。 - 方案2:升级WorkManager版本
将WorkManager版本升级至2.6.0及以上,该版本开始改用Jetpack Startup完成初始化,时序稳定性大幅提升,同时getInstance方法做了兼容处理,无需改动现有逻辑即可覆盖绝大多数时序异常场景。 - 方案3:使用懒加载注入避开启动时序冲突
若暂时不想调整初始化逻辑,可将WorkManager的注入改为懒加载模式,在Dagger注入处使用Lazy<WorkManager>替代直接注入WorkManager,第一次使用时再获取实例,避开Application启动阶段的时序冲突。
内容的提问来源于stack exchange,提问作者Subodh Nijsure
相关产品推荐
相关产品推荐

