如何映射从observable返回的值以在另一个observable中使用

时间:2015-12-20 17:09:55

标签: android rx-java rx-android

我有以下observable来获取数据库中的feed ID列表( 我使用糖ORM库

  public Observable<Set<Long>> getFeedIdsFromDB() {
            return Observable.create(subscriber -> {

                Set<Integer> subscribedFeedIds = new HashSet<>();

               //get feed ids from FeedEntity Table

                for (FeedEntity feed : FeedEntity.listAll(FeedEntity.class)){
                    if (feed.isSubscribed()){
                        subscribedFeedIds.add(feed.getFeedId());
                    }
                }
            });
    }

这个Observable应该发出以下用于api调用的id:

public Observable<StoryCollectionEntity> storyEntityList(final int page) {
        return this.restApi.storyCollection(/* this is feed ids*/ id, page)
                .distinct(storyCollectionEntity -> storyCollectionEntity)
                .doOnNext(saveStoryCollectionToCacheAction)

}

我想我应该使用某种映射但不知道如何实现它。

修改  我做了以下修改:

// To map feed ids (retrieved from database) to getAllStoryEntityList Observable: 
@Override
    public Observable<StoryCollectionEntity> storyEntityList(final int page) {
        return this.mNewsCache.getFeedIdsFromDB().flatMap(id -> getAllStoryEntityList(page, id));
    }



//call restApi
    public Observable<StoryCollectionEntity> getAllStoryEntityList(final int page, Set<Long> id){
            return this.restApi.storyCollection( id, page)
                    .distinct(storyCollectionEntity -> storyCollectionEntity)
                    .doOnNext(saveStoryCollectionToCacheAction);
        }

但是从不调用api服务。映射中存在错误。

@GET("story")
     Observable<StoryCollectionEntity> storyCollection(
            @Query("feed_ids") Set<Long> feedIds,
            @Query("page") int page);

1 个答案:

答案 0 :(得分:1)

getFeedIdsFromDB中创建的Observable不会发出任何项目,因此您的flatMap和其他数据转换永远不会发生,因为流实际上没有数据。您可以通过直接订阅返回的Observable并为onNext执行某些操作来测试它。

getFeedIdsFromDB().subscribe(feedId -> System.out.println(feedId));

你应该看到没有任何东西被打印出来。使用Observable#create时,必须使用您希望传递到下游的任何数据手动调用匿名类中subscriber onNext 方法。该文档提供了此示例代码。

因此,修改Observable以调用onNext,我们得到:

public Observable<Set<Long>> getFeedIdsFromDB() {
    return Observable.create(subscriber -> {
        Set<Integer> feedIds = new HashSet<>();

        // get feed ids from FeedEntity Table
        for (FeedEntity feed : FeedEntity.listAll(FeedEntity.class)){
            feedIds.add(feed.getFeedId());
        }

        // emit a single Set and complete
        if (subscriber.isSubscribed()) {
            subscriber.onNext(feedIds);
            subscriber.onCompleted();
        }
    });
}

现在应该传递Set。如果您的目标是在转换后最终发出单个StoryCollectionEntity对象(如果我正确地读取它),那么您的映射看起来是正确的。