【问题标题】:How to use LiveData with RxSearchView?如何将 LiveData 与 RxSearchView 一起使用?
【发布时间】:2018-02-06 18:13:03
【问题描述】:

我正在尝试将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)));
}

编辑:我应该改用Flowable 吗?

【问题讨论】:

  • 1.) 为什么要在 switchMap 中启动一个新的 observable,它应该是一个纯函数 2.) 在这种情况下使用 BehaviorSubject 而不是 LiveData

标签: android rx-java2 android-livedata rx-binding


【解决方案1】:

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

最后一点,您可以将简单的 lambda disposable -> rxSearchLiveData.addDisposable(disposable) 替换为更简单的方法参考 rxSearchLiveData::addDisposable

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多