Я использовал Coroutine для фоновых работ в приложении Android. но несмотря на завершение onDestory, DefaultDispatch остается и использует ресурсы процессора. В моем коде я использовал Coroutine просто.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
CoroutineScope(threadContext).launch(Dispatchers.Default) {
doSomething()
}
}
Я проверил в traceView и были DefaultDispatcher-worker. И эти рабочие запускаются многократно каждые 1сек введите описание изображения здесь
Я изучил источник Coroutine и обнаружил, что рабочие генерируются и бесконечно управляются терминированными.
override fun run() {
var wasIdle = false // local variable to avoid extra idleReset invocations when tasks repeatedly arrive
while (!isTerminated && state != WorkerState.TERMINATED) {
val task = findTask()
if (task == null) {
// Wait for a job with potential park
if (state == WorkerState.CPU_ACQUIRED) {
cpuWorkerIdle()
} else {
blockingWorkerIdle()
}
wasIdle = true
} else {
// Note: read task.mode before running the task, because Task object will be reused after run
val taskMode = task.mode
if (wasIdle) {
idleReset(taskMode)
wasIdle = false
}
beforeTask(taskMode, task.submissionTime)
runSafely(task)
afterTask(taskMode)
}
}
tryReleaseCpu(WorkerState.TERMINATED)
}
Интересно как я могу прекратить работу Coroutine и освободить поток для использования ЦП.