在我的 Android Kotlin 项目中,我在协程中调用 Web 服务(myWebservice
只是一个管理 Web 服务调用的自定义类):
fun searchForItems(userInput: String)
{
CoroutineScope(Dispatchers.IO + Job()).launch {
val listOfItems = myWebService.call(userInput)
}
}
每当用户在其中键入字符时都会调用该方法EditText
,因此该应用程序调用一个 Web 服务,该服务返回与他的请求匹配的项目列表。但我想优化它。
假设用户输入单词:“apple”。为了最大限度地减少 Web 服务调用的次数,我想要实现以下目标:
- 当用户键入第一个字母 (a) 时,将调用 Web 服务
- 当用户键入下一个字母时,只要第一个调用没有返回,就不会有新的 Web 服务调用(假设他有足够的时间来键入下一个字母 (pple))
- 当第一个 Web 服务调用完成时,将使用新的用户输入自动完成新的调用(苹果)
实现这一目标的最佳实践是什么?
或者有没有更好的方法来最大限度地减少 Web 服务调用的次数?
Thanks.
我使用 Kotlin 协程解决了这个问题:
class SomeViewModel : ViewModel() {
private var searchJob: Job? = null
fun search(userInput: String) {
searchJob?.cancel() // cancel previous job when user enters new letter
searchJob = viewModelScope.launch {
delay(300) // add some delay before search, this function checks if coroutine is canceled, if it is canceled it won't continue execution
val listOfItems = myWebService.call(userInput)
...
}
}
}
当用户输入第一个字母时search()
函数被调用,协程被启动并且Job
该协程的内容被保存到searchJob
. Then delay(300)
在调用 WebService 之前,调用函数来等待另一个用户输入。如果用户在 300 毫秒到期之前输入另一个字母search()
函数将被再次调用,之前的协程将被取消searchJob?.cancel()
function 和 WebService 不会在第一个协程中被调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)