You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dagger初始化时MyClass构造中runBlocking报错,改用get()能否修复?

问题:Dagger初始化异常与val初始化方式的修改

在第一段代码中,runBlocking代码行触发了Dagger初始化异常,异常发生在MyClass的<init>阶段。想知道把val的初始化改为get()版本能否解决这个类初始化时的问题。

原代码

class MyClass @Inject constructor(
     private val a: SomeClassA,
     private val b: SomeClassB): ParentOfMyClass {
     override val propa : SomeClass = runBlocking {
          some code that takes time
      }
}

修改后对比代码

class MyClass @Inject constructor(
     private val a: SomeClassA,
     private val b: SomeClassB): ParentOfMyClass {
     override val propa : SomeClass 
          get() = runBlocking {
              some code that takes time
      }
}

解答

改成get()版本确实能解决类初始化阶段的异常,核心原因在于执行时机的差异:

  • 原代码中,propa属于初始化时立即计算的属性:Dagger实例化MyClass的过程(也就是<init>阶段)会同步执行runBlocking里的耗时逻辑。如果这段逻辑依赖了未完全初始化的Dagger组件/依赖,或者在初始化线程中执行阻塞操作引发死锁、依赖未就绪,就会触发初始化异常。
  • 修改为get()后,propa的取值逻辑延迟到首次调用该属性时才执行,完全避开了MyClass的初始化环节。此时Dagger已经完成了MyClass及相关依赖的实例化,不会再在类初始化阶段抛出异常。

需要注意两个细节:

  • 每次调用propa都会重复执行runBlocking和内部的耗时代码,如果希望逻辑只执行一次,可以结合lazy委托:
    override val propa: SomeClass by lazy {
        runBlocking {
            some code that takes time
        }
    }
    
    这样既保留延迟初始化的优势,又保证逻辑仅执行一次。
  • runBlocking会阻塞调用线程,如果propa在UI线程调用,可能导致界面卡顿,建议根据业务场景改用协程异步处理(比如viewModelScope等)。

内容的提问来源于stack exchange,提问作者prashant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:12:33