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

实现移动互联网app离不开调用Restful APIs,以及等待Callback, 处理Response, 更新UI等套路。感谢Retrofit, RxJava等框架,大家应该已经习惯了这样的代码:

myCompositeDisposable?.add(requestInterface.getData()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(this::handleResponse))
 
}
复制代码

虽然也算简短,却远远称不上简明。9102年了,我们有更好的选择吗? Yes! 大家来感受下这个:

{
            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)
}
复制代码

如果没有豁然开朗, 请等我随后一一道来:)

转载于:https://juejin.im/post/5cb94bdce51d456e6d133492

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值