【问题标题】:why I can't concat two Single Android Room results with RxJava为什么我不能用 RxJava 连接两个 Single Android Room 结果
【发布时间】:2020-04-30 11:37:46
【问题描述】:

为什么 Single.concat(.., ..).toObservable() 不只返回一个 observable 来观察?

我正在研究 Android Room 数据库上的搜索功能,来自具有相同结果类型的不同来源。

我想按从第一个来源到第二个来源的顺序显示结果。

@Query("SELECT id, title, from table1 where title LIKE :title  || '%'")
fun getItemsFirstTable(title: String): Single<List<MinimumResult>>

@Query("SELECT id, title, from table2 where title LIKE :title  || '%'")
fun getItemsSecondTable(title: String): Single<List<MinimumResult>>

在视图模型中连接 Single 并返回 Observable 的方法

 public Observable<List<SearchItem>> concatSearchedItems(String s){
    return Single.concat(UseCaseKt.getItemsFirstTable(s), UseCaseKt.getItemsSecondTable(s)).toObservable()
}

在 TextWatcher 下方

     Observable.create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
            mEditTextSearch.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    emitter.onNext(s.toString());
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });
        }
    })
            .subscribeOn(Schedulers.io())
            .doOnNext( l -> Log.d(TAG, "onCreateView: "))
            .debounce(500, TimeUnit.MILLISECONDS)
            .distinctUntilChanged()
            .switchMap(new Function<Object, ObservableSource<List<SearchItem>>>() {
                @Override
                public ObservableSource<List<SearchItem>> apply(Object o) throws Exception {
                    return searchViewModel.concatSearchedItems(o.toString());
                }
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<SearchItem>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(List<SearchItem> searchItems) {
                    searchViewModel.searchList.setValue(searchItems);

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

调试后我发现 onNext 被调用了两次,尽管我已经 concat Single 结果。

【问题讨论】:

  • 那么你想显示 2 个结果列表,例如:[tab1result, tab2result],还是希望你的 Observable 发出 2 个项目:[tab2result] , [tab2result]?
  • 是的,我想同时显示两个查询的结果列表。现在 onNext(...) 被调用两次并返回每个列表,我想在 onNext() 中获取合并列表

标签: observable rx-java android-room concat


【解决方案1】:

Single.concat 不会从 Singles 的发射中连接数据,而是连接自身的 Singles。 所以你需要使用zip

public Observable<List<SearchItem>> concatSearchedItems(String s){
    return Singles.zip(UseCaseKt.getItemsFirstTable(s), UseCaseKt.getItemsSecondTable(s))
        { tab1list, tab2list -> listOf<SearchItem>().plus(tab1list).plus(tab2list) }
        .toObservable()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多