RxJava2-订阅PublishSubject

时间:2019-10-24 04:48:55

标签: android kotlin rx-java rx-java2

 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<List<GithubRepo>>
  • 的功能

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

我知道要从PublishSubject接收数据,我需要对其进行订阅。

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

为什么有可能?

2 个答案:

答案 0 :(得分:1)

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

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

每次调用方法textChange()时,您都推到searchSubject,它将再次触发开关图,从而再次触发RX链。

答案 1 :(得分:0)

是的,有可能在调用textchange()方法时获取数据。我在键入text api时调用了文字更改,并且在以下代码中接收到数据,因此我实现了这种功能。

我已经写了,请检查

 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()