Запустите сопрограмму в классе без деструктора / жизненного цикла - PullRequest
0 голосов
/ 04 ноября 2019

В настоящее время я изучаю, как использовать Coroutines, и под Android это довольно ясно для меня. Когда я хочу использовать сопрограмму в Fragment, например, я просто реализую CoroutineScope и отменяю эту область в onDestroy. Но как мне это сделать в классе, который не является Singleton / global и где у меня нет 100% безопасного способа отменить все запущенные сопрограммы, потому что нет деструктора, onDestroy и т. Д., Который вызывается каждый раз (Android Application класс например). Я просто реализую CoroutineScope без вызова cancel или я могу использовать runBlocking, может быть? Приведет ли это к утечкам памяти?

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете использовать GlobalScope. https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/index.html

Как говорится, вы, вероятно, не должны. Вы should можете контролировать свои текущие задания. Возможно, вы можете создать функции приостановки внутри класса, не относящегося к жизненному циклу, и вызывать их откуда-то, где у вас есть контроль над жизненным циклом (будь то Activity, Fragment, Presenter, ViewModel).

Отсутствие этого элемента управления может привести кутечки памяти и работы.

Надеюсь, это поможет. Приветствия!

РЕДАКТИРОВАТЬ:

Одна вещь, о которой я не думал в то время, была делегатом:

class YourNonLifecycleThingy(
    private val coroutineScope: CoroutineScope
) : CoroutineScope by coroutineScope

где coroutineScope, например, coroutineScope вашей деятельности.

...