0

我正在尝试LiveDataRxBinding库结合,我想使用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)));
}

编辑:我应该改用 aFlowable吗?

4

1 回答 1

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

于 2018-02-08T17:33:33.457 回答