Android RxJava-如何在发出新项时停止正在运行的任务

Android RxJava-如何在发出新项时停止正在运行的任务,android,kotlin,rx-java,Android,Kotlin,Rx Java,我正在用RxJava为我的Android应用程序构建搜索功能。当用户在EditText中键入/更改查询字符时,发射器将发出新的查询文本,我将在数据库中搜索以获得与查询匹配的结果 getEditTextObservable() .subscribeOn(Schedulers.computation()) .debounce(500, TimeUnit.MILLISECONDS) .filter {

我正在用RxJava为我的Android应用程序构建搜索功能。当用户在
EditText
中键入/更改查询字符时,发射器将发出新的查询文本,我将在数据库中搜索以获得与查询匹配的结果

getEditTextObservable()
                .subscribeOn(Schedulers.computation())
                .debounce(500, TimeUnit.MILLISECONDS)
                .filter {
                    !it.isNullOrEmpty()
                }
                .map {
                    //start searching
                    getResultsInDatabase(it) //this function takes a long time to complete
                }.observeOn(AndroidSchedulers.mainThread())
                .subscribe{
                    //render results on screen
                }

方法
getResultsInDatabase(string:string)
需要很长时间才能完成,当查询文本发生更改时,我想停止方法
getResultsInDatabase(string:string)
(如果它正在使用先前发出的查询运行)以使用新查询再次运行它。我如何才能做到这一点?我将感谢你的帮助。感谢您阅读我的问题。

您可以使用
valve
RxJava中暂停流。根据它的值,流将继续发出或将保持在暂停状态。

您可以使用
RxJava中暂停流。根据它的值,流将继续发射或保持在暂停状态。

您需要一个
开关映射

getEditTextObservable()
    .subscribeOn(Schedulers.computation())
    .debounce(500, TimeUnit.MILLISECONDS)
    .filter { !it.isNullOrEmpty() } //Be careful with this. Should clearing text clear results too?
    .switchMap { 
        Observable.fromCallable { getResultsInDatabase(it) }.subscribeOn(Schedulers.io()) 
    }.observeOn(AndroidSchedulers.mainThread())
    .subscribe{
        //render results on screen
    }

您需要一个
开关映射

getEditTextObservable()
    .subscribeOn(Schedulers.computation())
    .debounce(500, TimeUnit.MILLISECONDS)
    .filter { !it.isNullOrEmpty() } //Be careful with this. Should clearing text clear results too?
    .switchMap { 
        Observable.fromCallable { getResultsInDatabase(it) }.subscribeOn(Schedulers.io()) 
    }.observeOn(AndroidSchedulers.mainThread())
    .subscribe{
        //render results on screen
    }

谢谢你,我会尝试向你发送反馈。我按照你的建议将
map
更改为
switchMap
,但它没有像我预期的那样工作。这或多或少是我用Rx编写自己的搜索函数的方式,所以这很令人惊讶
switchMap
通过在上游更改时创建新订阅来工作。这意味着,当查询发生变化时,它会删除先前的订阅以获取数据库结果,并启动一个新的链。也许您应该添加一个使用线程池(io())的调度程序来获取结果,并将其添加到
fromCallable{}
中。谢谢,我关注您的评论,现在它工作得很好。只要修改你的答案,我就接受。顺便说一句,你能解释得更详细些吗?我玩过
switchMap
操作符。我意识到
subscribeOn(Schedulers.io())
只是一个语句,用于防止在发出新项之前执行
fromCallable
块中的代码。即使我使用
subscribeOn(AndroidSchedulers.mainThread())
并删除
subscribeOn
debounce
操作符,您的答案仍然有效。谢谢,我将尝试向您发送反馈。我按照您的建议将
map
更改为
switchMap
,但它并没有像我预期的那样工作。这或多或少是我用Rx编写自己的搜索函数的方式,所以这令人惊讶
switchMap
通过在上游更改时创建新订阅来工作。这意味着,当查询发生变化时,它会删除先前的订阅以获取数据库结果,并启动一个新的链。也许您应该添加一个使用线程池(io())的调度程序来获取结果,并将其添加到
fromCallable{}
中。谢谢,我关注您的评论,现在它工作得很好。只要修改你的答案,我就接受。顺便说一句,你能解释得更详细些吗?我玩过
switchMap
操作符。我意识到
subscribeOn(Schedulers.io())
只是一个语句,用于防止在发出新项之前执行
fromCallable
块中的代码。即使我使用
subscribeOn(AndroidSchedulers.mainThread())
并删除
subscribeOn
debounce
操作符,您的答案仍然有效。谢谢。我是RxJava新手,我将搜索
valve
并尝试应用它。谢谢。我是RxJava新手,我将搜索
valve
并尝试应用它。