【问题标题】:RxJava2 - Subscribing PublishSubjectRxJava2 - 订阅 PublishSubject
【发布时间】:2019-10-24 04:48:55
【问题描述】:
 private val searchSubject =  PublishSubject.create<Boolean>()
private val compositeDisposable = CompositeDisposable()

fun textChange(){
    searSubject.onNext(true)
}

fun getSubject(){
    compositeDisposable += searchSubject
        .doOnNext {
            if (it) showLoading()
        }
        .switchMap { searchGithubReposObservable() }
        .subscribeWith(object : DisposableObserver<List<GithubRepo>>() {
            override fun onNext(t: List<GithubRepo>) {
                hideLoading()
                adapter.items = t
            }

            override fun onComplete() {
            }

            override fun onError(e: Throwable) {
                hideLoading()
            }
        })
}
  • searchGithubReposObservable 是返回Observable&lt;List&lt;GithubRepo&gt;&gt; 的函数

我在 github 中搜索了学习 RxJava 的示例代码。 但是,我看不懂上面的代码。

我知道要从 PublishSubject 接收数据,我需要订阅它。

在上面的代码中,我认为subscribeWith 订阅了 searchGithubReposObservable() 的 return Observable ,但是我可以在调用 textchange() 时从 PublishSubject 获取数据。

为什么会这样?

【问题讨论】:

    标签: android kotlin rx-java rx-java2


    【解决方案1】:

    您正在收听发布主题的 RX 链的开始。

    compositeDisposable += searchSubject
        .doOnNext {
            if (it) showLoading()
        }
    

    每次调用 textChange() 方法时,您都会推送到 searchSubject,它会再次触发 RX 链并触发 switchmap。

    【讨论】:

    • 哦,我明白了。因此,也许 subscribeWtih 方法应用于 searchSubject。谢谢!
    【解决方案2】:

    是的,您是否有可能在调用 textchange() 方法时获取数据我已经实现了这种类型的功能,而我正在输入文本 api 在 textchange 上被调用,并且我收到以下代码的数据。

    我已经写好了,请检查

     autocompletetextview.debounce(500L, TimeUnit.MILLISECONDS)
                        .distinctUntilChanged()
                        .filter { it.trim().isNotEmpty() || it.isEmpty() }
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .flatMap {
                            Observable.just(callapi here )
                        }
                        .subscribe({
                            it.subscribe({ serviceResponse ->
                                if (serviceResponse.meta.status == KeyUtils.HTTP_SUCCESS ||
                                        serviceResponse.meta.status == KeyUtils.STATUS_META_ERROR) {
                                    setSuccessResponse(serviceResponse, true)
                                } else {
                                    setSuccessResponse(serviceResponse, false)
                                }
                            }, { throwable ->
                                setErrorResponse(throwable)
                            }).collect()
    

    【讨论】:

    • 哦,对不起。我的意思是为什么我的代码有效?详细解释一下,为什么我可以从 PublishSubject 中获取数据。我以为我订阅了 searchGithubReposObservable() 方法而不是 PublishSubject。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2019-05-19
    • 1970-01-01
    相关资源
    最近更新 更多