Android postDelayed против Coroutines задержка - PullRequest
0 голосов
/ 24 сентября 2019

Я видел этот пример, и мне интересно, есть ли объективная причина для реализации этого с помощью Coroutines delay вместо Android Handler postDelayed?

В случае, если ссылка умираеткод из примера ниже:

val watcher = object :TextWatcher{
    private var searchFor = ""

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        val searchText = s.toString().trim()
        if (searchText == searchFor)
            return

        searchFor = searchText

        launch {       
            delay(300)  //debounce timeOut
            if (searchText != searchFor)
                return@launch

            // do our magic here
        }
    }

    override fun afterTextChanged(s: Editable?) = Unit
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
}

РЕДАКТИРОВАТЬ: Чтобы уточнить, delay из сопрограмм может быть заменен с задержкой из Android Handler postDelayed.Разница в том, что сопрограммы будут выполнять задержку с задержкой, в то время как Android-обработчик будет выполнять задержку, сохраняя сообщение в очереди сообщений потока, который будет выполнен позже.Кажется, эффект тот же, разница в том, как выполняется задержка.Есть ли какая-то объективная причина, почему один или другой был бы лучше здесь?

EDIT2: Оказывается, что под капотом диспетчеры Coroutine будут использовать что-то вроде Android-обработчика.Обратитесь к this для более подробной информации.Это означает, что введение сопрограмм для простой задержки не стоит.

1 Ответ

2 голосов
/ 24 сентября 2019

Ну, в общем, сопрограммы намного лучше, чем потоки обработчиков, и всякий раз, когда вы используете обработчики, он выполняет ваш исполняемый файл в основном потоке пользовательского интерфейса после выполнения метода post delay, однако, приписывая сопрограммам, вы всегда можете указать задержку в различных контекстах, например, при запуске {} используется, он выполняет вашу сопрограмму в потоке пользовательского интерфейса или, если вам нужна задержка в фоновом режиме, вы можете использовать aync {}.

Более того, обработчики ограничены выполнением требуемого кода в исполняемом модуле и после пост-задержки, если вы хотитечтобы возобновить работу с точки останова, вы не можете сделать это легко.

Так что сопрограммы в основном облегчают этот процесс для нас, когда, если вы вызываете задержку, он приостанавливает или отклоняет ваш метод на определенное время, а затемвернуться с того места, где произошла задержка.

Чтобы быть более конкретным, взгляните на это, например: -

suspend fun myfunc(){
print("Hello") //prints a hello
delay(300) //this line suspends your function for 300 milliseconds
print("World") //when delay is over world will be printed  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...