所以我正在将一个示例应用程序从 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
's 片段或活动方法中简单地取消订阅并清除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 和返回或不返回数据。取消工作后有没有更好的方法来退货?