我正在编写Android应用程序。我在网络层使用RxJava进行Retrofit。基本上我遇到的问题是我有一个名为/feed
的端点。此端点返回我在RecyclerView中显示的文章集合。其中一些文章是广告文章,一些是活动,另一些是帖子。我正在使用一个干净的架构,所以每个我想做的事情都有一个Interactor。这就是我GetFeedInteractor
的样子:
@Override
public void execute(final Callback callback, int offset, int pageSize) {
final String userSipId = mUserSipid.get();
mFeedRepository.getFeed(offset, pageSize)
.subscribe(new DefaultSubscriber<List<BaseFeedItem>>() {
@Override
public void onNext(List<BaseFeedItem> baseFeedItems) {
List<BaseFeedItem> cacheCollection = new ArrayList<BaseFeedItem>();
for (BaseFeedItem baseFeedItem : baseFeedItems) {
if (!(baseFeedItem instanceof AdFeedItem)) {
cacheCollection.add(baseFeedItem);
}
}
mFeedCache.saveFeeds(cacheCollection);
callback.onFeedsFetched(baseFeedItems);
}
});
}
正如您所看到的,用于显示UI中项目的Callback将使用所有三种类型的Feeds并显示它们。但是我只需要在Sqlite缓存中保存Post文章和Event文章。问题是我不喜欢在Subscriber中为instanceof做这件事。有没有更好的Rx方式呢?
BTW我在几个地方使用FeedCache#saveFeed方法,但只有在这里我才能获得广告文章。因此,在FeedCache#saveFeed中进行广告过滤不是一个好的选择。
我认为完美的解决方案是,如果我可以使用一些Rx方法过滤集合,并且有一个处理原始列表的订阅者,另一个处理广告过滤列表。这样的事情。
答案 0 :(得分:1)
所以,基本上你想要从一个流中获得2个流。一个是原始流(用于显示UI),另一个是过滤流(用于保存在数据库中)。不幸的是,您不能拥有多个onSubscribe
,但我们可以使用Subject
s的概念。
final PublishSubject<BaseFeedItem> subject = PublishSubject.create();
subject.subscribe(o -> {
// here will be emitted all items
// update the UI
});
mFeedRepository.getFeed(offset, pageSize)
.map(item -> {
subject.onNext(item);
return item;
})
.filter(item -> !(item instanceof AdFeedItem))
.subscribe(items -> {
// no `AddFeedItem`s here
// save into database
});