如何使用rxjava处理一系列异步事件?

时间:2016-12-09 08:54:29

标签: asynchronous rx-java

我是Rxjava的新手,我在谷歌搜索了很多。但对我的问题不是很有用。 我的情况是使用第三方SDK的Living App。但是进入起居室的过程很复杂而且没有控制。

关于整个过程如下:

  1. 从app的服务器获取肝脏的房间信息--- Async
  2. 通过调用SDK的api --- Async
  3. 进入客厅
  4. 如果成功,请通过调用SDK的IM api --- Async
  5. 加入聊天组
  6. 然后使用最后一步的结果更新UI。
  7. 每一步都依赖于上一步的结果,并且回调不是相同的IN / OUT类型,所以我很难用rxjava对它进行编码。

    感谢。

2 个答案:

答案 0 :(得分:0)

您不能期望在没有任何代码库的情况下为您提供有关您的应用可以执行的操作的正确源代码。 我建议你在开始编码之前尝试阅读/理解观察者模式

在这里,您可以看到Observer模式的结构如何工作

          Observable.just(getRoomInfo())
                  .map(info -> sdkApi(info))
                  .map(response -> joinChannel(response))
                  .subscribeOn(Schedulers.newThread())//-->This make your pipeline async.
                  .subscribe(res -> updateUI(res))

在这里,您可以看到有关RxJava如何工作的一些文档和实际示例。 https://github.com/politrons/reactive

答案 1 :(得分:0)

您可以使用Observable.fromEmitter将异步调用包装在一个observable中,如下所示:

return Observable.fromEmitter(new Action1<Emitter<GetRoomModel>>() {
    @Override
    public void call(final Emitter<GetRoomModel> emitter) {
        AsyncFunction yourAsyncFunction = /* ... */
        final AsyncFunction.Listener listener = new AsyncFunction.Listener() {
            @Override
            public void onResult(RoomInfo roomInfo) {
                emitter.onNext(roomInfo);
            }
        };
        yourAsyncFunc.doAsync(/* data */, listener);
        emitter.setCancellation(new Cancellable() {
            @Override
            public void cancel() throws Exception {
                // cancel your async call
            }
        });
    }
}, Emitter.BackpressureMode.BUFFER);

您可以为每个异步调用执行相同的操作,然后将它们链接起来。