【发布时间】:2018-06-21 08:47:14
【问题描述】:
我有一个关于哪种风格的 java rx 更适合使用的问题。假设您有一个 Web 服务,它返回一个项目列表,我们将用一个列表来表示。现在大多数教程似乎都是通过 observable 发出单个值来处理这个问题,例如:
Observable<Todo> todoObservable = Observable.create(new ObservableOnSubscribe<Todo>() {
@Override
public void subscribe(ObservableEmitter<Todo> emitter) throws Exception {
try {
List<Todo> todos = RxJavaUnitTest.this.getTodos();
for (Todo todo : todos) {
emitter.onNext(todo);
}
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
}
});
但是你可以通过 Single 处理这种情况,发出一个列表:
Single.create(new SingleOnSubscribe<List<Todo>>() {
@Override
public void subscribe(SingleEmitter<List<Todo>> emitter) throws Exception {
List<Todo> todos = RxJavaUnitTest.this.getTodos();
emitter.onSuccess(todos);
}
})
在整个列表中为每个项目发射是否有优势?在我看来,大多数情况下您希望将项目组合回 ui 中的列表...
【问题讨论】:
-
Single如果您获得的此列表没有分页,则最好使用。即它支持一个页面,在该页面中一次查询并使用所有数据。Observable将是要走的路,如果您有一个列表流,每次从服务中读取一页。 -
即便如此,您也可能只是将参数传递给 Single - 您想要的页面并期望获得该列表?
-
我会使用
BehaviorSubject.switchMap{}类型的Observable进行分页,因为当我调用BehaviorSubject.onNext(page)时,它会自动触发订阅调用,而无需编写样板文件。当没有更多页面时,您调用BehaviorSubject.onComplete()以在完成时执行操作。如果使用Single,您需要不断创建订阅调用,为每个页面编写样板,而不是留下一个钩子。当然,无论哪种方式,您都需要在生命周期结束时dispose它们,否则它们会导致泄漏。