目标数据库
首先,定义好异步结果泛化类型AsyncResult,此处会用到Kotlin泛型编程基础知识:编程
sealed class AsyncResult<out T : Any>
data class AsyncSuccess<out T : Any>(val data: T?) : AsyncResult<T>()
data class AsyncError(val error: String?) : AsyncResult<Nothing>()
inline fun <T : Any> AsyncResult<T>.onSuccess(action: (T?) -> Unit): AsyncResult<T> {
if (this is AsyncSuccess) action(data)
return this
}
inline fun <T : Any> AsyncResult<T>.onError(action: (String) -> Unit) {
if (this is AsyncError && error != null) action(error)
}
复制代码
基于此AsyncResult和Kotlin协程suspend关键字,能够定义任意异步操做(网络请求,数据库操做等)以下:bash
suspend fun demoAction(): AsyncResult<List<DemoItem>> {
//请暂时忽略实现方法
}
复制代码
接下来好戏登场,UI部分的代码:网络
launch {
demoAction()
.onSuccess {
Toast.makeText(this@MainActivity, "Successfully Fetched ${it?.size} Items", Toast.LENGTH_LONG)
.show()
}
.onError {
Toast.makeText(this@MainActivity, "Failed!! -- $it", Toast.LENGTH_LONG).show()
}
}
复制代码
很是优雅有木有?!异步
具体操做(实现)函数
展现过了魔术效果, 咱们来揭秘下几处关键手法:ui
onSuccess{}.onError{}
的写法。