@NicolasJafelle Ваш вопрос станет большим и многоплановым. лучше задать новый вопрос.

му я переносю пример приложения из RxJava в Kotlin / Anko Corountines, и мне интересно, я делаю лучший (первый) подход к этому:

fun getPopulationList() {
    val ref = asReference()

    async(UI) {
        try {
            ref().setCurrentState(ViewState.State.LOADING)
            val background = bg {
                repository.populationResponse().execute().body()
            }

            ref().let {
                it.response = background.await()
                it.mvpView?.onGetData(it.response)
                it.setCurrentState(ViewState.State.FINISH)
            }
        } catch (e: Exception) {
            e.printStackTrace()
            ref().mvpView?.onError(e)
        }
    }
}

Я использую архитектуру MVP, где мойPresenter базовый класс имелCompositeSubscription и вonDestroyФрагмент или метод активности просто отписаться и очиститьCompositeSubscription объект. Но мне интересно, еслиasReference() Функция Anko Coroutines делает то же самое, и нет необходимости сохранять списокDeferred<T> а затем повторить и отменить один за другим.

Кстати, если я добавлюThread.sleep(5000) чтобы смоделировать большую транзакцию и уничтожить фрагмент, который я вижу в logcat, ответ HTTP даже после того, как фрагмент не виден / не уничтожен, в то время как с RxJava не происходит, поэтому я думаю, что я не использую должным образом.

ОБНОВИТЬ

 fun getPopulationList() {
    val ref = asReference()

    job = launch(UI) {

        try {
            ref().setCurrentState(ViewState.LOADING)
            val background = bg {
                Thread.sleep(5000) //simulate heavy IO

                if (isActive) {
                    repository.populationResponse().execute().body()
                } else {
                    return@bg null
                }
            }

            ref().let {
                it.response = background.await()
                it.mvpView?.onGetData(it.response)
                it.setCurrentState(ViewState.FINISH)
            }
        } catch (e: Exception) {
            RestHttpExceptionHandler().handle(UI, e, ref())
        }
    }
}

Я могу отменить сопрограмму во время разговораjob.cancel() вonDestroy() метод, но, чтобы заставить его работать, я должен проверить, является ли задание активным или нет, и это переводит в if / else и возвращаемые или нет данные. Есть ли лучший способ вернуть что-то, когда работа была отменена?

Ответы на вопрос(1)

Ваш ответ на вопрос