如何用新的RxJava2替换返回的observable

时间:2017-11-14 23:01:30

标签: android rx-java observable rx-java2

我有一个案例需要立即返回observable,但后来用另一个替换这个observable。

这是一个例子

    private Flowable<byte[]> mFlowableStream = Flowable.empty();

   @Override
    public Flowable<byte[]> startStreamRead() {
        bindToService();
        return mFlowableStream;
    }

然后在绑定到服务之后,我提供了一个类似

的回调连接
@Override
public void bindToService() {
    mAppContext.bindService(new Intent(mAppContext,StreamService.class), mServiceConnection, 0);
}

    @Override
    public void onServiceConnected(ComponentName name, IBinder binder) {

       mServiceInterection = ((StreamServiceInterection.LocalBinder) binder).getServiceInteractor();
        mStreamDisposable = mServiceInterection.getStream()
                .subscribe(new Consumer<byte[]>() {
                    @Override
                    public void accept(byte[] data) throws Exception {

                    }
                });
    }

我想要做的是以某种方式用我从服务中获得的新的observable替换返回的先前mFlowableStream

实施此措施的可能策略是什么?也许我应该返回一些其他值,比如Future

请建议如何解决此问题

由于

1 个答案:

答案 0 :(得分:0)

您可以使用 Flowable.create 代替 Flowable.empty

然后当新数据到来时,只需推送到可流动的。 像例子

final ArrayList<FlowableEmitter<Integer>> arrEmitter = new ArrayList<>();

    Flowable<Integer> futureFlow = Flowable.create(new FlowableOnSubscribe<Integer>() {
        @Override
        public void subscribe(final FlowableEmitter<Integer> e) throws Exception {
            e.onNext(1);
            e.onNext(2);

            arrEmitter.add(e); // hold emitter to use later
        }
    }, BackpressureStrategy.BUFFER);

    futureFlow.subscribe(new ResourceSubscriber<Integer>() {
        @Override
        public void onNext(Integer integer) {
            System.out.println("onNext: " + integer);
        }

        @Override
        public void onError(Throwable t) {

        }

        @Override
        public void onComplete() {
            System.out.println("onComplete");
        }
    });


    // =========== When data come 
    FlowableEmitter<Integer> holdEmitter = arrEmitter.get(0);

    holdEmitter.onNext(3);

或者使用你可以根据需要使用**主题*类型

Understanding RxJava Subject — Publish, Replay, Behavior and Async Subject