在我的 Android Kotlin 项目中,我在协程中调用了一个网络服务(myWebservice
只是一个管理网络服务调用的自定义类):
fun searchForItems(userInput: String)
{
CoroutineScope(Dispatchers.IO + Job()).launch {
val listOfItems = myWebService.call(userInput)
}
}
每次用户在 EditText
中键入一个字符时都会调用该方法,因此该应用程序会调用一个网络服务,该服务会返回与他的请求相匹配的项目列表。但我想优化它。
假设用户键入单词:“apple”。为了尽量减少 webservice 调用的次数,这里是我想要实现的:
- 当用户键入第一个字母 (a) 时,网络服务被调用
- 当用户输入下一个字母时,只要第一个调用没有返回,就不会有新的网络服务调用(假设他有足够的时间输入下一个字母(苹果))
- 当第一个 web 服务调用完成时,新的调用将自动完成并使用新的用户输入(苹果)
实现该目标的最佳做法是什么? 或者是否有更好的方法来尽量减少网络服务调用的次数?
谢谢。
最佳答案
我使用 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
。然后调用 delay(300)
函数等待另一个用户输入,然后再调用 WebService。如果用户在 300 毫秒过期前输入另一个字母,search()
函数将被再次调用,之前的协程将使用 searchJob?.cancel()
函数取消,WebService 将不会被调用在第一个协程中调用。
关于android - 如何最小化使用 Kotlin 协程的 web 服务调用次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62325870/