CoroutineWorker:在 cancelPendingIntent 操作上中断 doWork()
CoroutineWorker: interrupt doWork() on cancelPendingIntent action
是否可以在触发通知的取消操作时取消在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)
}
}
是否可以在触发通知的取消操作时取消在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)
}
}