我用以下代码(facebook4j库)获取facebook帖子:
public List<BatchResponse> getAllPosts() {
BatchRequests<BatchRequest> batch = new BatchRequests<>();
batch.add(new BatchRequest(RequestMethod.GET, "USERID/feed?limit=5"));
batch.add(new BatchRequest(RequestMethod.GET, "USERID2/feed?limit=5"));
List<BatchResponse> results = facebook.executeBatch(batch);
return results;
}
然后我使用RXJava来解析代码:
Observable.defer(() -> Observable.just(getAllPosts()))
.subscribeOn(Schedulers.io())
.flatMap(Observable::from)
.map(BatchResponse::asResponseList)
.flatMap(Observable::from)
.map(rawPost -> DataObjectFactory.createPost(rawPost.toString()))
.toSortedList(MainActivity::compareModel)
.flatMap(Observable::from)
.map(Post::getMessage)
.subscribe(Log::v, Throwable::printStackTrace);
我试着用这个建议来排序
private static Integer compareModel(Post car1, Post car2) {
return car1.getCreatedTime().compareTo(car2.getCreatedTime());
}
我的问题是,它不排序所有的帖子,但它只排序一个用户(/一个批处理请求)的帖子。我认为这是因为批量请求被连续执行,因为平面映射。我不知道怎么解决这个问题
我不认为你的问题是flatMap的问题。toSortedList
必须等待您的Observable
完成后才能进行排序。您可能需要在之前添加一些日志(例如,感谢doOnNext(evt -> /** log something **/)
)。
我认为你可能要检查什么返回asReponseList
和createPost
方法。它可能不会返回所有内容。
请找到下面你的代码与一些小的更新(见flatMapIterable
做同样的事情作为flatMap(Observable::from)
)
Observable.fomCallable(() -> getAllPosts())
.subscribeOn(Schedulers.io())
.flatMapIterable(l -> l)
.flatMapIterable(BatchResponse::asResponseList)
.map(rawPost -> DataObjectFactory.createPost(rawPost.toString()))
.doOnNext(evt -> LOGGER.debug(evt))
.toSortedList(MainActivity::compareModel)
.flatmapIterable(l -> l)
.map(Post::getMessage)
.subscribe(Log::v, Throwable::printStackTrace);