Несколько DefaultDispatch остается в рабочем состоянии после использования Coroutine - PullRequest
0 голосов
/ 13 марта 2020

Я использовал 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 и освободить поток для использования ЦП.

...