我有以下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);
答案 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
对象(如果我正确地读取它),那么您的映射看起来是正确的。