GlobalScope vs LifecycleOwner: CoroutineScope - PullRequest
       19

GlobalScope vs LifecycleOwner: CoroutineScope

0 голосов
/ 27 ноября 2018

при условии, что CoroutineScope реализован некоторым компонентом, учитывающим жизненный цикл, таким как Presenter.когда предпочтительнее использовать GlobalScope.produce, а не CoroutineScope.produce;

interface IPresenter, CoroutineScope {
  fun state(): ReceiveChannel<Event>
}

class Presenter(
  override val coroutineContext: CoroutineContext
): IPresenter, DefaultLifecycleObserver {
  fun state(): ReceiveChannel<Event> = GlobalScope.produce {
    send( SomeEvent() )
  }

  fun someOperation() = produce {
    send( SomeEvent() )
  }

  override fun onDestroy(owner: LifecycleOwner) {
    coroutineContext.cancel()
    owner.lifecycle.removeObserver(this)
  } 
}

когда аннулируется канал ReceiveChannel, возвращаемый state()?это утечка памяти?

1 Ответ

0 голосов
/ 27 ноября 2018

Документация гласит:

Запущенная сопрограмма отменяется при отмене канала приема.

Кроме того, она заявляет

Примечание. Это экспериментальный API. Поведение производителей, которые работают как дочерние элементы в родительской области в отношении отмены и обработки ошибок, может измениться в будущем.

Вывод: поведение при отмене родительской области не определено и может измениться в будущем.

Именно поэтому лучше всего использовать GlobalScope для производителя и использовать возвращенное значение * 1020.* явно контролировать жизненный цикл.Канал не будет автоматически закрыт / отменен.

...