如何在Kotlin中等待Retrofit异步操作完成?

时间:2018-10-24 14:23:30

标签: android kotlin async-await

我是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中等待异步操作完成的最佳方法是什么?

3 个答案:

答案 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)
}

希望有帮助。