实现移动互联网app离不开调用Restful APIs,以及等待Callback, 处理Response, 更新UI等套路。感谢Retrofit, RxJava等框架,你们应该已经习惯了这样的代码:bash
myCompositeDisposable?.add(requestInterface.getData()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(this::handleResponse))
}
复制代码
虽然也算简短,却远远称不上简明。9102年了,咱们有更好的选择吗? Yes! 你们来感觉下这个:app
{
getData()
.onSuccess { data ->
Toast.makeText(this@MainActivity, "Successfully Fetched ${data?.size} Items", Toast.LENGTH_LONG)
.show()
}
.onError { error ->
Toast.makeText(this@MainActivity, "Failed!! -- $error", Toast.LENGTH_LONG).show()
}
}
复制代码
有点魔幻是吧?其实并不难实现,请看这段泛型化代码:框架
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)
}
复制代码
若是没有豁然开朗, 请等我随后一一道来:)ui