почему я не могу объединить два результата в одноместном номере Android с RxJava - PullRequest
0 голосов
/ 30 апреля 2020

Почему Single.concat (.., ..). ToObservable () не возвращает только одну наблюдаемую наблюдаемую информацию?

Я работаю над функцией поиска в Android базе данных комнат из разных источников с тем же типом результата.

Я хочу показать результаты по порядку из первого источника, затем из второго источника.

@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 и возвращает наблюдаемую в представлении модель

 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 вызывается дважды, несмотря на то, что я уже конкатат Отдельные результаты.

1 Ответ

0 голосов
/ 30 апреля 2020

Single.concat не объединяет данные из числа одиночных игр, а объединяет их отдельно. Поэтому вам нужно использовать 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()
}
...