RxKotlin - 动态观察者数组

时间:2017-11-09 08:04:50

标签: android kotlin rx-java rx-android rx-kotlin

我将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());
    }

我确信有更好的方法可以做到这一点

谢谢!

1 个答案:

答案 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上,并且只有一个取消订阅。