代码之家  ›  专栏  ›  技术社区  ›  dev.farmer

RxJava switchMap不会取消之前的请求

  •  0
  • dev.farmer  · 技术社区  · 7 年前

    我正在用Kotlin,OkHttp,RxJava2开发一个Android应用程序。

    我想做一个自动搜索。

    override fun search(subject: PublishSubject<String>) {
        disposable.add(
                subject.debounce(1000, TimeUnit.MILLISECONDS)
                        .filter { it.isNotEmpty() }
                        .distinctUntilChanged()
                        .switchMap { keyword ->
                            search(keyword)
                        }
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe({ response ->
                            // using the response
                        }, {
                            it.printStackTrace()
                        })
        )
    }
    

    以及搜索功能:

        fun search(keyword: String): Observable<String> {
            val request = Request.Builder()
                .url(url)
                .post(RequestBody.create(contentType, xmlBody(keyword)))
                .build()
    
            return Observable.fromCallable {
                val response = OkHttpClient().newCall(request).execute()
                response.body()?.string()
            }
        }
    

    我试着用SimpleXMLConverter改装,但它不适合这个项目。 所以我使用“OkHttp”。

    第一个电话没问题。 但是在处理第一个请求的同时接收到下一个搜索请求时会发生异常。

    0 回复  |  直到 7 年前
        1
  •  0
  •   GaRRaPeTa    6 年前

    你把时间表设置错了。

    你需要:

    override fun search(subject: PublishSubject<String>) {
    disposable.add(
            subject.debounce(1000, TimeUnit.MILLISECONDS)
                    .filter { it.isNotEmpty() }
                    .distinctUntilChanged()
                    .switchMap { keyword ->
                        search(keyword).subscribeOn(Schedulers.io())
                    }
    
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe({ response ->
                        // using the response
                    }, {
                        it.printStackTrace()
                    })
    )
    

    }

    switchmap 这是在主链以外的链中执行搜索,否则整个链将被阻止并 swichmap 将似乎没有任何效果,因为它将取消搜索只有当这已经自然完成。