我正在尝试将LiveData
与RxBinding
库结合使用,我想使用RxSearchView
并使用switchMap
来订阅最新的observable。我不确定我的实施是否良好。我会告诉你我的代码,请告诉我是否还有其他方法可以实现这一目标?
disposable = RxSearchView.queryTextChanges(searchView)
.debounce(300, TimeUnit.MILLISECONDS)
.switchMap(charSequence -> {
detailViewModel.loadSearchTask(charSequence);
return Observable.just(charSequence);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
compositeDisposable.add(disposable);
public void loadSearchTask(CharSequence s) {
taskInteractor
.search(s.toString())
.doOnSubscribe(disposable -> rxSearchLiveData.addDisposable(disposable))
.subscribe(
charSequence -> rxSearchLiveData.setValue(Resource.success(charSequence)),
throwable -> error.setValue(Resource.error(throwable.getMessage(), throwable)));
}
编辑:我应该使用Flowable
吗?
答案 0 :(得分:0)
您的实施有几个问题。第一个是,第一个subscribe()
没有定义任何消费者。第二个是,你没有必要改变线程。
我看到的最大问题是,您在映射中订阅了。相反,您应该只映射到另一个Observable
并使用单个订阅链来处理所有内容。
我将跳过Disposable
处理,因此请注意在必要时将其添加回去。
RxSearchView.queryTextChanges(searchView)
.debounce(300, TimeUnit.MILLISECONDS)
.switchMap(s -> taskInteractor.search(s.toString()))
.subscribe(
charSequence -> rxSearchLiveData.setValue(Resource.success(charSequence)),
throwable -> error.setValue(Resource.error(throwable.getMessage(), throwable)));
作为最后一点,您可以使用更简单的方法引用disposable -> rxSearchLiveData.addDisposable(disposable)
替换简单的lambda rxSearchLiveData::addDisposable
。