忘掉RxJava! Kotlin异步请求DSL更优雅

实现移动互联网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

相关文章
相关标签/搜索