【发布时间】:2018-03-20 01:49:05
【问题描述】:
我正在尝试使用 RxJava / Retrofit,我想编写一个扩展函数来包装一些逻辑与网络结果。
我有一个类 NetworkConsumer 扩展了 Consumer。
abstract class NetworkConsumer<T> : Consumer<NetworkResponse<T>> {
override fun accept(response: NetworkResponse<T>) {
if (response.isSuccessful()) {
onSuccess(response.data)
} else {
onFailure()
}
}
// other functions such as onSuccess and onFailure
}
我想创建一个扩展函数,让我可以像使用普通 Consumers 一样使用 Lambda 语法。
service.login(email, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
result ->
// result is the correct object
}, {
// handle the error
})
但是,如果我想使用我的NetworkConsumer,我必须这样做:
.subscribe(object : NetworkConsumer<LoginResponse>() {
override fun onSuccess(response: LoginResponse) {
// ...
所以我正在尝试编写一个扩展函数,例如:
fun <T> Observable<T>.subscribe(onNext: NetworkConsumer<in T>, onError: Consumer<in Throwable>): Disposable {
return subscribe(onNext, onError, Functions.EMPTY_ACTION, Functions.emptyConsumer<Any>())
}
但是它没有编译,错误是:
> Type mismatch.
> Required: Consumer<in T!>!
> Found: NetworkConsumer<in T>
【问题讨论】:
-
您是否考虑过使用 RxKotlin (github.com/ReactiveX/RxKotlin),它基本上只是 RxJava 的 Kotlin 扩展方法的集合?你也可以看看他们的代码是如何实现订阅者扩展的github.com/ReactiveX/RxKotlin/blob/2.x/src/main/kotlin/io/…
-
我一直在研究,并尝试了一些东西,虽然我能够让他们的代码为扩展功能工作,但我仍然不确定如何修改它来让我结果回到我想要的样子。我不明白如何在那种情况下使用我的
NetworkConsumer,并允许我将所有错误路由到 onError 消费者。
标签: android kotlin rx-java kotlin-extension