¿Cuál es la forma correcta de usar las extensiones de Anko Coroutines?
Así que estoy migrando una aplicación de ejemplo de RxJava a Kotlin / Anko Corountines y me pregunto si estoy haciendo el mejor (primer) enfoque:
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)
}
}
}
Estoy usando una arquitectura MVP donde miPresenter
la clase base tenía unCompositeSubscription
y en elonDestroy
'Fragmento o método de actividad simple darse de baja y borrar elCompositeSubscription
objeto. Pero me pregunto si elasReference()
la función de Anko Coroutines hace lo mismo y no es necesario guardar una lista deDeferred<T>
y luego iterar y cancelar uno por uno.
Por cierto si agrego unThread.sleep(5000)
para simular una gran transacción y destruir el Fragmento Puedo ver en el logcat la respuesta HTTP incluso después de que el fragmento no sea visible / destruido mientras que con RxJava no sucede, así que creo que no lo estoy usando correctamente.
ACTUALIZAR
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())
}
}
}
Puedo cancelar la rutina mientras llamojob.cancel()
enonDestroy()
pero para que funcione tengo que verificar si el trabajo está activo o no y eso se traduce en un if / else y un retorno o no datos. ¿Hay alguna forma mejor de devolver algo cuando se canceló el trabajo?