为什么我不能用 RxJava 连接两个 Single Android Room 结果
why I can't concat two Single Android Room results with RxJava
为什么 Single.concat(.., ..).toObservable() 不 return 只有一个 observable 可以观察?
我正在研究 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 和 return 一个 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 被调用了两次。
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()
}
为什么 Single.concat(.., ..).toObservable() 不 return 只有一个 observable 可以观察?
我正在研究 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 和 return 一个 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 被调用了两次。
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()
}