【问题标题】:Java rx - should you use Single<List<Item>> or rather Observabe<Item>Java rx - 你应该使用 Single<List<Item>> 还是 Observable<Item>
【发布时间】: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 它们,否则它们会导致泄漏。

标签: android rx-java rx-java2


【解决方案1】:

如果您从 Web 服务获取数据,则 Single 会更有意义。您只期待一个响应实例。

仅当您希望 Web 服务请求成为流时,Observable 才会对您有益。对于大多数 Single 可以以更少的开销为您提供所需的东西。

【讨论】:

  • 您能否通过示例用例详细说明“如果您希望 Web 服务请求是流”?我猜你的意思是将每个“Todo”传递给发射器之间会有延迟?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多