#kotlin #coroutine
#kotlin #сопрограмма
Вопрос:
В сопрограмме kotlin большинство стандартных методов построения (например, launch) возвращают ссылку на задание,
заключается ли дизайн в том, чтобы сохранить эти ссылки в чем-то, например, в карте / списке (управление запущенными заданиями «вручную»), или есть способ найти запущенное задание в заданной области?
scope.launch { /* starting a coroutine in scope */ }
есть ли способ позже получить ссылку на запущенную сопрограмму, не сохраняя ссылку на запущенное задание, возвращаемое scope.launch, или мы должны управлять этим самостоятельно (например. сохранить ссылку, возвращаемую при запуске)?
Комментарии:
1. чтобы упростить вопрос, есть ли способ получить все задания, запущенные в области сопрограммы? есть ли способ назначить тег сопрограмме, а затем извлечь его, или этой функции нет? в случае, если требуется вызвать cancel не для всей области, а для нескольких сопрограмм
Ответ №1:
необходимо сохранить ссылку на родительское задание
val job = Job()
val scope = CoroutineScope(Dispatchers.IO job)
scope.launch {
...
job.children // this return all jobs started in this scope
}
Комментарии:
1. Хорошо, хорошо, спасибо за ответ, но можете ли вы, например, назначить тег заданию, а затем найти в последовательности дочерних элементов? я имею в виду, вы знаете, что запустили конкретное задание в этой области, как вы его вернете? возможно, одним из способов было бы использовать хэш-код для запущенного задания и сохранить его для последующего использования
2. на самом деле я сохраняю глобальную ссылку на конкретное задание после запуска, поэтому я могу управлять им индивидуально, но, возможно, есть другой способ, возможно, я мог бы использовать CoroutineContext.Key
3. это лучший способ. Другой способ — по индексу. Например
job.children.elementAt(0)
, запущены ли первые дочерние элементы4. да, я вижу, что нет прямого / простого способа сделать это, и по индексу неясно найти конкретную работу, спасибо