java - 在返回到订阅者之前,如何拦截一个可观察对象并在 RxJava 中修改它?

标签 java android retrofit rx-java reactive-programming

我目前正在尝试点击一个服务并返回一个对象列表,在它返回给订阅者之前,我想对列表中的每个对象进行另一个同步调用以进行另一个服务调用以设置丢失 field 。我成功地进行了所有调用,但是订阅者中返回的对象具有我需要设置为空的字段。这是我的代码示例:

示例服务:

rx.Observable<List<ExampleObject>> getExampleObject();
rx.Observable<MissingObject> getMissingObjectByFoo(@Path("foo") String foo);

示例类:

public class ExampleObject {
    String foo;
    MissingObject bar;

    public String getFoo() {
        return this.foo;
    }

    public void setFoo(String value) {
        this.foo = value;
    }

    public MissingObject getBar() {
        return this.bar;
    }

    public void setBar(MissingObject value) {
        this.bar = value;
    }
}

示例实现:

mService.getExampleObject().flatMap(new Func1<List<ExampleObject>, Observable<?>>() {
            @Override
            public Observable<List<ExampleObject>> call(List<ExampleObject> exampleObjects) {
                for (ExampleObject entry : exampleObjects) {
                    String foo = entry.getFoo();
                    mService.getMissingObjectByFoo(foo)
                            .subscribeOn(mScheduler.backgroundThread())
                            .observeOn(mScheduler.mainThread())
                            .subscribe(new Subscriber<MissingObject>() {
                        @Override
                        public void onCompleted() {

                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onNext(MissingObject missingObject) {
                            entry.setBar(missingObject);
                        }
                    });
                }
                return Observable.just(exampleObjects);
            };

最佳答案

因为更新条目的中间调用是异步的,我认为您不能坚持使用 List<ExampleObject> , 但应该操纵 ExampleObject直接来自 Observable :

mService.getExampleObject()
    // Spread the list
    .flatMap(list -> Observable.from(list))
    // Update your object
    // Here we zip the object with the missing object,
    // so that when the missing object is obtained,
    // we update the entry and emit it.
    .flatMap(entry -> Observable.zip(
           Observable.just(entry), 
           mDocsService.getMissingObjectByFoo(entry.getFoo()), 
           (entry, missingObject) -> {
               entry.setBar(missingObject);
               return entry;
           })
    )
    // if you really want a map after all
    .toList();

边注:

如果您对 map 中的功能没问题,则可以跳过 zip取决于外部变量(条目)。这是我尽量避免的事情,但无论如何:

    .flatMap(entry -> mDocsService.getMissingObjectByFoo(entry.getFoo())
                                  .map(missingObject -> {
                                      entry.setBar(missingObject);
                                      return entry;
                                   })
    )

关于java - 在返回到订阅者之前,如何拦截一个可观察对象并在 RxJava 中修改它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663967/

相关文章:

java - 制作一个显示前 10 名玩家的排行榜?

java - Switch 语句未初始化的变量

java - 如果我的 android 项目依赖于具有其他依赖项的 .jar,我是否必须将这些依赖项包含在我的项目中?

android - 如何使用android在图表引擎中实现TimeChart

android - 在嵌套的 JSON 对象中使用 Retrofit

java - 使用 OpenJDK 在 Windows 上运行 JabRef

java - 移动跨平台工具: When it will be useful?

android - 在下载文件之前从 URL 解析文件名

android - 如何使用 Retrofit 发送 post 请求?

android - Retrofit 不支持 CLEARTEXT 通信