我正在使用 kotlin 协程从带有 viewmodel 的 android 中的服务器获取响应。问题是我想获得两个不同的请求响应来更新 ui 但想同时执行它们并等待它们都完成。然后使用收到的所有结果更新 ui。如果在每个请求之后使用 async 和 await 它将一一执行并且它不是并发的,如果使用请求映射和 awaitAll(),我无法处理多种数据类型(数据类),因为两个请求的数据类型不同. 可能不止两个请求。对于这种情况我该怎么办?
val job = viewModelScope.launch {
val a = async { firstUseCase.execute() }.await()
val b = async { secondUseCase.execute() }.await()
}
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我请求json填充recyclerview,它在init int kotlin viewmodel中的第一个总是成功,但是当我想再次在timer.schedule方法中请求时,它转到一次性订阅中的onError方法,这是Edittext的onTextChange绑定在xml视图中:
fun onSearchTextChanged(text: CharSequence) {
if (text.isNotEmpty()) {
if (myTimer != null) {
myTimer!!.cancel()
}
myTimer = Timer()
myTimer!!.schedule(object : TimerTask() {
override fun run() {
loadMovies(text.toString(), 1)
}
}, 1000)
} else {
if (myTimer != null) {
myTimer!!.cancel()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的请求方法:
fun loadMovies(searchText: String, pageNumber: Int) {
subscription = searchApi.getSearch(API_KEY, searchText, pageNumber)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { onRetrieveMoviesListStart() }
.doOnTerminate { onRetrieveMoviesListFinish() }
.subscribe(
{ result -> onRetrieveMoviesListSuccess(result) },
{ err -> onRetrieveMoviesListError(err) })
} …Run Code Online (Sandbox Code Playgroud)