CoroutineWorker: прерывание doWork () при действии cancelPendingIntent

Можно ли отменить работу, выполненную в doWork(), когда срабатывает действие отмены из уведомления?

class TestWorker(context: Context, parameters: WorkerParameters) :
    CoroutineWorker(context, parameters) {

    override suspend fun doWork(): Result {

        setForeground(createForegroundInfo())
        doStuff()
        return Result.success()
    }

    private fun doStuff() {
        for (i in 0..10) {
            Log.d(LOG, "Can this be interrupted?")
            Thread.sleep(1000)
        }
    }

    private fun createForegroundInfo(): ForegroundInfo {
        val cancelIntent = WorkManager.getInstance(applicationContext)
            .createCancelPendingIntent(id)

        val notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)

            ...

            .addAction(android.R.drawable.ic_delete, "cancel", cancelIntent)
            .build()

        createChannelIfNeeded()
        return ForegroundInfo(1, notification)
    }


person adriennoir    schedule 27.05.2020    source источник


Ответы (1)


Thread.sleep(1000) не прерывается сопрограммами. Если вы используете delay(1000), то его можно будет прервать в соответствии с этим сообщением в блоге.

private suspend fun doStuff() {
    for (i in 0..10) {
        Log.d(LOG, "Can this be interrupted?")
        delay(1000)
    }
}
person ianhanniballake    schedule 27.05.2020
comment
Вы можете игнорировать задержку. Там может быть любая длительная работа. - person adriennoir; 28.05.2020
comment
Тогда вам, вероятно, следует прочитать сообщение в блоге, на которое я указал, в котором конкретно говорится о том, как сделать работу вашей сопрограммы отменяемой. - person ianhanniballake; 28.05.2020
comment
Проверка isStopped помогла. - person adriennoir; 28.05.2020