Как я могу гарантировать, что сервисный вызов и соответствующий интерфейс обновляются синхронно - PullRequest
0 голосов
/ 11 апреля 2019

Поэтому я пытаюсь обновить 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...