我将RxKotlin与Retrofit 2一起使用
我试图找出如何在一次操作中获得动态观察者列表。
第一个观察者应该触发操作,所有其他观察者应该等到操作完成/失败
操作完成后,我需要进行数据操作(存储在缓存/内存中),然后通知所有观察者。
这就是我的所作所为:
class UserManager
{
val observers = ArrayList<Observer<ArrayList<User>>>()
var isFetchingUsers = false
fun getUsers(observer: Observer<ArrayList<User>>)
{
observers.add(observer)
if (isFetchingUsers)
{
return
}
api.getUserList.observeOn(AndroidSchedulers.mainThread()).subscribe(object : Observer<UserListResponse>
{
override fun onNext(response: UserListResponse)
{
// Do some manipulations on the response and notify all
observers.forEach {
it.onNext(response.getUsers())
}
}
override fun onError(e: Throwable)
{
observers.forEach {
it.onError(Throwable())
}
}
override fun onComplete()
{
isFetchingUsers = false
observers.clear()
}
override fun onSubscribe(d: Disposable)
{
}
})
}
}
这里是Retrofit可观察的创建(这个是在Java中。)
/**
* Get users
*/
public Observable<UserListResponse> getUserList()
{
return mService.getUserList().subscribeOn(Schedulers.io());
}
我确信有更好的方法可以做到这一点
谢谢!
答案 0 :(得分:0)
您可以在observable上使用share()
运算符。只有第一个订阅才会使observable执行其创建过程。一旦最后一个订阅者取消订阅,observable将执行其销毁过程。
Observable<Long> v;
...
Observable<Long> sharedObservable = v
.doOnSubscribe( () -> logger.debug("subscribe") )
.doOnUnsubscribe( () -> logger.debug("unsubscribe") )
.share();
...
Subscription v1 = sharedObservable.subscribe();
Subscription v2 = sharedObservable.subscribe();
...
v1.unsubscribe();
v2.unsubscribe();
您将看到订阅操作仅发生一次。您应该看到只有一个订阅操作发生在原始observable上,并且只有一个取消订阅。