如何在CoroutineScope(Dispatchers.Default).launch{}中访问getter并获取Observable结果?
问题解答
问题1:如何在CoroutineScope(Dispatchers.Default).launch{}中访问getter()?
- 普通属性的getter(比如类成员变量的
val x get() = ...),可直接在协程块内调用,只要该属性在当前作用域可访问即可。 - 若getter是挂起函数,直接在协程块内调用,协程会自动处理挂起逻辑。
- 若getter涉及阻塞IO操作,建议在协程块内用
withContext(Dispatchers.IO)包裹调用,避免占用Default调度器的CPU线程:CoroutineScope(Dispatchers.Default).launch { val value = withContext(Dispatchers.IO) { someObject.blockingGetter() } }
问题2:如何将Observable调用结果赋值给temperature?
你用launch启动协程时,它仅返回Job(用于管理协程生命周期),不会返回协程内的执行结果。要获取Observable的结果,需结合RxJava与协程的适配工具:
步骤1:添加依赖
确保项目引入kotlinx-coroutines与RxJava的适配库(以RxJava3为例):
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx3:1.7.3"
步骤2:使用await()获取Observable结果
方式1:在协程内直接获取(适合已有协程上下文)
在协程块内将Observable转换为挂起调用,直接拿到结果:
CoroutineScope(Dispatchers.Default).launch { val temperature = WebService.getTemperatureAsFloat().await() // 在此处使用temperature }
方式2:获取Deferred结果(适合外部等待结果)
若需在协程外部获取结果,用async替代launch,它返回Deferred<T>,通过await()获取最终值:
val temperatureDeferred = CoroutineScope(Dispatchers.Default).async { WebService.getTemperatureAsFloat().await() } // 在需要结果的地方调用await()(必须在协程内或用runBlocking) val temperature = runBlocking { temperatureDeferred.await() }
注意事项
- 不要在主线程直接调用
runBlocking,会阻塞UI。 - Android平台建议使用生命周期绑定的协程Scope(如
viewModelScope、lifecycleScope),避免内存泄漏。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

