Qual é a maneira correta de usar as extensões da Anko Coroutines?
Portanto, estou migrando um aplicativo de exemplo do RxJava para o Kotlin / Anko Corountines e estou pensando se estou fazendo a melhor (primeira) abordagem:
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)
}
}
}
Estou usando uma arquitetura MVP em que meuPresenter
classe base tinha umCompositeSubscription
E noonDestroy
fragmento ou método de atividade simples cancele a inscrição e limpe aCompositeSubscription
objeto. Mas eu estou querendo saber se oasReference()
A função da Anko Coroutines faz o mesmo e não é necessário salvar uma lista deDeferred<T>
e itere-o e cancele um por um.
Aliás, se eu adicionar umThread.sleep(5000)
para simular uma grande transação e destruir o fragmento, vejo no logcat a resposta HTTP mesmo depois que o fragmento não é visível / destruído enquanto o RxJava não acontece, então acho que não estou usando corretamente.
ATUALIZAR
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())
}
}
}
Consigo cancelar a corotina enquanto ligojob.cancel()
noonDestroy()
método, mas para fazê-lo funcionar, tenho que verificar se o trabalho está ativo ou não e se isso se traduz em dados if / else e return ou not. Existe alguma maneira melhor de devolver algo quando o trabalho foi cancelado?