我是Kotlin的新手,来自C#,我已经很习惯async\await
在返回频道列表之前,如何等待tvClient
得到响应?
override fun getChannels(): MutableList<Channel> {
disposable = tvClient.getChannels()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{Log.d("***", it.toString())},
{Log.d("***",it.toString())}
)
TODO("wait for tvClient to return results")
return mChannels;
}
我尝试使用协程,但没有运气
在Kotlin中等待异步操作完成的最佳方法是什么?
答案 0 :(得分:1)
您正在使用 RxJava ,因此您应该以反应方式实现它。
如果您的应用尚未针对其构建,则可以获取值阻止。假设getChannels()
返回一个,您可以直接调用blockingGet()
而不是subscribe()
。
但是请注意,这会阻止调用外部getChannels()
的线程。
使用协程可能更适合您。它与您从 C#中了解到的信息更加接近,并且可以使用retrofit2-kotlin-coroutines-adapter直接与 Retrofit 集成。
答案 1 :(得分:1)
您可以考虑使用Jake Wharton https://github.com/JakeWharton/retrofit2-kotlin-coroutines-adapter
的改进协程适配器。答案 2 :(得分:0)
您可以在https://github.com/eriknyk/networkcall-sample/commits/master
上使用DSL检查kotlin v1.3改型+稳定协程的功能实现。DSL模板:
fun <RESPONSE: DataResponse<*>, DATA: Any> networkCall(block: CallHandler<RESPONSE, DATA>.() -> Unit): MutableLiveData<Resource<DATA>>
= CallHandler<RESPONSE, DATA>().apply(block).makeCall()
interface DataResponse<T> {
fun retrieveData(): T
}
并使用它:
fun getRepos(query: String) = networkCall<ResposResponse, List<Repo>> {
client = githubService.getRepos(query)
}
希望有帮助。