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