android - 如何最小化使用 Kotlin 协程的 web 服务调用次数?

标签 android kotlin kotlin-coroutines kotlin-flow debouncing

在我的 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/

相关文章:

android - 改造中的调用或响应?

android - Android 动画是如何工作的?

android - 如何请求振动许可?

android - 带有 Android Studio 的 Protobuf

kotlin - IDE 对 Dispatchers.IO 协程中的阻塞调用发出警告

android - 尝试使用 Paging Library 3 时在 Gradle 中发现重复的类

java - 修复软键盘上方的布局

java - Galaxy S II 上的 SMS_RECEIVED 未触发 BroadcastReceiver

kotlin - Kotlin 中的 Dagger 2 模块和通用参数

java - Android Views 的 WeakReference 安全吗?