android - 协程 worker : interrupt doWork() on cancelPendingIntent action

标签 android android-workmanager

当触发通知的取消操作时,是否可以取消在 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)
    }

最佳答案

Thread.sleep(1000) 不可被协程中断。如果您使用delay(1000),那么它将按照 this blog post 被中断。 .

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

关于android - 协程 worker : interrupt doWork() on cancelPendingIntent action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62050518/

相关文章:

android - JSON 数据解析 - 如何?

java - 如何处理网络问题

java - 通过tag停止WorkManager并检查是否运行有问题

Android Studio 未检测到 Microsoft Android 模拟器

java - 处理 Activity 和服务生命周期

java - AutoCompleteTextView 和异步类

android - WorkManager 的 OneTimeWorkRequest 的重试策略/机制是什么

android - workstatus 观察者始终处于排队状态

android - 处理和解决 "Excessive network usage (background)"的正确方法

java - ClipboardManager 使用 WorkManager 抛出以下错误 : Can't create handler inside thread that has not called Looper. 准备()