¿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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta