Нужно ли управлять актером или каналом (закрывать / завершать), когда он инкапсулируется другим объектом, таким как TextWatcher? - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы реализовать DebounceTextWatcher.Я намереваюсь использовать actor, чтобы потреблять изменения текста и отлаживать их в указанный промежуток времени, а затем пересылать события внешнему потребителю.Код будет выглядеть следующим образом:

class DebounceTextWatcher(
  delayMs: Long = DebounceTextWatcher.DEFAULT_TIMER_DELAY_MS,
  handler: (text: String) -> Unit
) : TextWatcher {

  private val channel = GlobalScope.actor<String> {
    debounce(delayMs).consumeEach(handler)
  }

  override fun afterTextChanged(s: Editable?) {
    channel.offer(s?.toString().orEmpty())
  }

  override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
  override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}

  companion object {
    const val DEFAULT_TIMER_DELAY_MS = 600L
  }
}

fun <T> ReceiveChannel<T>.debounce(timeMs: Long): ReceiveChannel<T> = GlobalScope.produce {
  var value = receive()

  whileSelect {
    onTimeout(timeMs) {
      send(value)
      value = receive()
      true
    }
    onReceive {
      value = it
      true
    }
  }
}

Мои опасения

  1. Это правильное использование GlobalScope или я должен передать в CoroutineContext или CoroutineScopeкак зависимость?
  2. Должен ли я заботиться о том, чтобы вызывать close() или каким-либо образом завершать actor, когда заканчивается жизненный цикл Activity / Fragment, содержащего ссылку TextWatcher?

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

1 Ответ

0 голосов
/ 11 октября 2018

Сам канал не будет сохранять ресурсы, но ваш обработчик, вероятно, сохранит.Вы рискуете такой последовательностью событий:

  1. элемент попадает во входную очередь канала
  2. приложение приостанавливается, его активность уничтожается
  3. приложение возобновляется, и теперьэлемент обрабатывается
  4. ваш обработчик, связанный со старым действием, запускает и вылетает приложение

Я получил много ложных сбоев в подобных сценариях.Я продолжал вставлять одну дыру за другой, и приложение продолжало падать на некоторых устройствах и в некоторых особых обстоятельствах.Это прекратилось только тогда, когда я реализовал шаблон «основная работа».Позже Котлин навязал эту схему.

...