我有使数据库选择并返回 Observable<> 的方法。 我如何从 Kotlin modelview calss 中调用这样的方法?
private val _response = MutableStateFlow(Response())
val response: StateFlow<Response> = _response
suspend fun getResponse() {
viewModelScope.launch(exceptionHandler) {
withContext(Dispatchers.IO) {
_response.emit(apiCall)//Type mismatch. need Response but getting Observable<Response!>!
}
}
}
另一个班级
public Observable<Responnse> apiCall(){
return cacheObservable.flatMap(response -> {return observableResponse});
};
kotlinx
反应库中有Rx和Kotlin协程之间的转换。添加到您的依赖项:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.6.4"
// Match the coroutines version you are already using.
// Change rx2 to rx3 depending on which version of Rx you're using.
然后您可以在 Observable 上调用
asFlow()
将其转换为 Flow,因此您的 ViewModel 代码将变为以下内容:
val response: StateFlow<Response> = apiCall().asFlow()
.flowOn(exceptionHandler)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000L), Response())
无需指定调度员或创建单独的
getResponse()
函数来发起呼叫。它将在您第一次收集此流量时开始通话。
我以
WhileSubscribed(5000L)
为例。这允许在 Fragment 离开屏幕时节省资源,但如果它像在屏幕旋转期间那样短暂,则避免必须重新启动它。