Поэтому я пытаюсь обновить AutoCompleteTextView
с некоторыми предложениями от SmartyStreets. Он работает хорошо (т. Е. Обновляет список новыми предложениями каждый раз, когда меняется буква), пока я не введу второй пробел в адресе. Затем я полагаю, что перерывы обратного вызова прерываются, потому что textWatcher вызывается дважды для одного и того же текста, который вызывает службу. Каков наилучший способ справиться с этим и убедиться, что вызов службы и обновление пользовательского интерфейса выполняются до того, как будет сделан следующий вызов службы?
Вот услуга:
Класс SmartyStreetsAddressService: CoroutineScope {
val job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun requestAddressMatch(count: Int, text: String, callback: (List<String>, Int) -> Unit) {
if (text == "") {
return
}
launch {
try {
val credentials = StaticCredentials(BuildConfig.SmartyStreetsAuthId, BuildConfig.SmartyStreetsAuthToken)
val client = ClientBuilder(credentials).buildUsAutocompleteApiClient()
val lookUp = Lookup(text)
lookUp.geolocateType = GeolocateType.STATE
val result = withContext(Dispatchers.IO) {
client.send(lookUp)
}
val addresses = parseAddresses(result)
callback.invoke(addresses, count)
} catch (ex: BadCredentialsException) {
Log.exception(ex)
}
}
}
private fun parseAddresses(result: Array<Suggestion>): List<String> {
val addressStrings = mutableListOf<String>()
result.forEach { addressStrings.add(it.text) }
return addressStrings
}
}
А как это называется:
startView.addTextChangedListener(object : SimpleTextWatcher {
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
val wasModified = viewModel.route?.modifyStartAddress(s.toString()) ?: false
if (wasModified) {
viewModel.route?.modifyStartLatitude(null)
viewModel.route?.modifyStartLongitude(null)
addressService.requestAddressMatch(count, viewModel.route?.startAddress?: "", updateAndShowSuggestions)
}
}
})
И перезвонят:
val updateAndShowSuggestions = { suggestions: List<String>, tempCount: Int ->
routeWayPointsViewModel.autoCompleteAddressAdapter.clear()
routeWayPointsViewModel.autoCompleteAddressAdapter.addAll(suggestions)
}