传播可观察的,然后将其重新组合在一起

时间:2016-05-17 09:42:57

标签: android retrofit rx-java rx-android

问题

我需要创建这样的操作:

get all elements from DB -> send call to API that these elements are marked as read -> save status of read elements

我试图与RxJava建立一个良好的链条,我想:

  1. 从数据库收集数据
  2. 使用带有remoteIds的List<Integer>创建了Observable
  3. 在这些元素上调用API
  4. 收集所有回复并将其作为List<Integer>
  5. 传递
  6. 保存回复
  7. 问题是从第3点开始传播和分组.4。我不知道如何制作这样一个链。正如您在下面看到的那样,我使用我的代码坚持第3点,因为我不知道如何为每个请求收集数据。在我的案例中是否存在某种可能有用的转换?

    实际进展又名代码

     sub = getDb()
                .createQuery(DbContract.Notification.TABLE_NAME, sql, String.valueOf(NOTIFICATION_UNREAD))
                .map(new CursorListMapper<>(new NotificationPersistenceModel()))
                .map(new Func1<List<DataNotification>, Observable<List<Integer>>>() {
                    @Override
                    public Observable<List<Integer>> call(List<DataNotification> notifications) {
                        List<Integer> ids = new ArrayList<>();
                        for (DataNotification notification : notifications) {
                            ids.add(notification.getRemoteId());
                        }
    
                        return Observable.just(ids);
                    }
                })
                .subscribe();
    

    修改

    • Observables列表似乎是一个坏主意 - 改为Observable<List<Integer>>

1 个答案:

答案 0 :(得分:1)

不是映射到Observable<List<Integer>>,而是映射到List<Integer>,然后使用Observable.from()将列表转换为发出每个列表元素的Observable。接下来你只需将其映射到Api调用。这是一个例子

getDb()
        .createQuery(...)
        .map(...)
        .map(...) // map to List<Integer>
        .flatMap(new Func1<List<Integer>, Observable<List<Response>>>() {
            @Override
            public Observable<List<Response>> call(List<Integer> integers) {
                return Observable.from(list)
                        .flatMap(new Func1<Integer, Observable<Response>>() {
                           @Override
                           public Observable<Response> call(Integer integer) {
                                return api.call(integer);
                            }
                        })
                        .toList();
            }
        })

比你可以继续映射/ flatMapping到你想要实现的任何目标