@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 и возвращаемые или нет данные. Есть ли лучший способ вернуть что-то, когда работа была отменена?