Как ждать завершения асинхронной операции Retrofit в Котлине? - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в 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 голосов
/ 25 октября 2018

Вы можете ознакомиться с использованием модифицированных сопрограммных адаптеров от Джейка Уортона https://github.com/JakeWharton/retrofit2-kotlin-coroutines-adapter

0 голосов
/ 22 декабря 2018

Вы можете проверить функциональную реализацию модернизации kotlin v1.3 + стабильные сопрограммы, используя DSL здесь https://github.com/eriknyk/networkcall-sample/commits/master

Шаблон 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)
}

Надеюсь, это поможет.

0 голосов
/ 24 октября 2018

Вы используете RxJava , и, следовательно, вы должны реализовать его реактивным способом.

Если ваше приложение еще не собрано для него, вы можете получить блокировку значений.Предполагая, что getChannels() возвращает сингл, который вы можете просто вызвать blockingGet() вместо subscribe().

Но имейте в виду, что это блокирует поток, из которого вызывается внешний getChannels().

Использование сопрограмм может быть лучше для вас.Это немного ближе к тому, что вы знаете из C # и с retrofit2-kotlin-coroutines-адаптер вы можете напрямую интегрировать с Retrofit .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...