如何将LiveData与RxSearchView一起使用?



我正在尝试将LiveDataRxBinding库相结合,我想使用RxSearchView并使用switchMap来订阅最新的可观察量。我不确定我的实现是否良好。我会给你看我的代码,你能告诉我是否有其他方法可以实现这一点吗?

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吗?

您的实现有几个问题。第一个是,第一个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)));

最后,您可以将简单的 lambdadisposable -> rxSearchLiveData.addDisposable(disposable)替换为更简单的方法引用rxSearchLiveData::addDisposable

最新更新