【问题标题】:How to apply a RxJava operator?如何应用 RxJava 运算符?
【发布时间】:2015-07-11 16:38:22
【问题描述】:

我有以下对象结构

class Object1 {
  A[] item1;    //array of Object A
  B[] item2;    //array of Object B
  C[] item3;    //array of Object C
}

class C {
  int value1;
  int value2;
  String imageUrl; //null, to be updated from a api call
}

我收到 Observable<Object> 进行改造 api 调用。对象CimageUrl 字段是null,我必须通过另一个改造api 调用来更新它。我想使用 RxJava 更新每个 Object C in C[] in Observable<Object1> 的 imageUrl。我如何使用 RxJava 运算符做到这一点?

我希望方法返回更新后的Observable<Object1>

【问题讨论】:

    标签: android retrofit rx-java


    【解决方案1】:

    这应该可行:

    getObject1()
            .flatMap(obj1 -> Observable.from(obj1.item3)
                    .cast(C.class)
                    .flatMap(item -> getImageUrl(item.value1).doOnNext(url -> item.imageUrl = url))
                    .toList()
                    .map(items -> obj1))
    

    出于测试目的,我的getImageUrl 看起来像这样:

    Observable<String> getImageUrl(int id) {
        return Observable.just(String.format("id = %d", id));
    }
    

    它可能看起来像这样:

    Observable<String> getImageUrl(int id) {
        return api.getImageUrl(id).map(SomeResponse::getImageUrl);
    }
    

    【讨论】:

    • 我无法访问 doOnNext() 中的项目以更新 url。还有我必须在最后一个 map() 运算符中更新的 obj1 。如何访问之前操作符中的对象?
    • @r7v,注意括号。
    【解决方案2】:

    我不是 RxJava 方面的专家,但是如何:

    observable
        .flatMap(Observable.from(object1.item3))
        .flatMap(//do request and mix object)
        .collect()
        .filter(//map the new array to he object1)
    

    【讨论】:

    • 我希望最终结果是 Observable<Object1>使用更新的 C[] 和 imageurls
    • Collect 发出一个带有 List 的 C 对象的 observable。在第二个平面图中,您发出请求并将它们混合,返回混合的 C 对象的 observable,
    • 我在末尾添加了一个过滤元素,将列表更改为单个对象1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2018-04-26
    相关资源
    最近更新 更多