如何使用RxJava ReplaySubject <object>在定义间隔中发出对象

时间:2018-02-27 15:44:02

标签: java android rx-java rx-android

我有自定义的对象集,我想在每2秒后发出一次。这意味着当我将一组项添加到ReplaySubject&lt;&gt;它应该每2秒访问那些逐个 onNext()方法的对象。此对象将添加到ReplaySubject&lt;&gt;动态地对用户事件。这就是我使用ReplaySubject&lt;&gt;的原因。

我已经实现了这一点,但我想暂停并恢复这个帖子 基于一些条件,它将根据用户交互进行更改。如何实现这一点。

这是我的代码。

private ReplaySubject<CartItemToBeRemove> cartItemToBeRemoveSubject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        ButterKnife.bind(this);

        cartItemToBeRemoveSubject = ReplaySubject.create();

        initDeleteQueue();
    }

public void initDeleteQueue() {

        cartItemToBeRemoveSubject
                .delay(2,TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new Observer<CartItemToBeRemove>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(CartItemToBeRemove itemToBeRemove) {
                        cartData.remove(itemToBeRemove.getItem());
                        cartListAdapter.notifyItemRemoved(itemToBeRemove.getPosition());
                        Log.d(TAG, "item" + deletedItem.getName());
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });
    }

我将对象添加到ReplaySubject,如下所示

cartItemToBeRemoveSubject.onNext(toBeRemove);

1 个答案:

答案 0 :(得分:0)

您想要为可观察流添加调步。正常起搏每两秒发射一次物品,但可能会暂停并恢复。

基本的调步机制类似Observable.interval( 2, SECONDS ),每2秒发出一次Long。但是,您希望偶尔暂停它。我们假设我们有一个Observable<Boolean>,当要启动调步机制时会TRUE,而FALSE应该暂停。

Observable<Boolean> pacingControl;

pacingControl
  .switchMap( ctl -> ctl ? Observable.interval( 0, 2, SECONDS ) : Observable.never() )
  .zipWith( cartItemToBeRemoveSubject, (t, item) -> item )
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe( ... );

pacingControl可以作为主题实施,用户操作可以pacingControl.onNext( TRUE )启动流程,也可以pacingControl.onNext( FALSE )暂停。 switchMap()运算符在计时器和never()之间切换,显然从不产生任何东西。