【发布时间】:2023-02-17 00:12:25
【问题描述】:
我创建了一个简单的CoroutineWorker,它运行循环 1000 次,延迟 1000 毫秒。
这个工作者是唯一的周期性工作者,重复间隔为 15 分钟,ExistingPeriodicWorkPolicy 为 KEEP
但是当我启动工作人员并且在执行期间一段时间后工作人员被取消并出现异常JobCancellationException
完整的例外:
Exception kotlinx.coroutines.JobCancellationException: Job was cancelled; job=JobImpl{Cancelling}@ba57765
12:55:47.088 WM-Wor...rapper I Work [ id=4c44c3da-3c57-4cac-a40a-82c948125807, tags={ com.sk.workmanagerdemo1.DownloadingWorker } ] was cancelled
java.util.concurrent.CancellationException: Task was cancelled.
at androidx.work.impl.utils.futures.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1184)
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:514)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:311)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
工人代码:
import android.content.Context
import android.util.Log
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
import java.text.SimpleDateFormat
import java.util.*
class DownloadingWorker(context: Context, params: WorkerParameters) :
CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
return withContext(Dispatchers.IO) {
Log.i("MYTAG", "Started ${getCurrentDateTime()}")
return@withContext try {
for (i in 0..1000) {
delay(1000)
Log.i("MYTAG", "Downloading $i")
}
Log.i("MYTAG", "Completed ${getCurrentDateTime()}")
Result.success()
} catch (e: Exception) {
Log.i("MYTAG", "Exception $e")
Result.failure()
}
}
}
private fun getCurrentDateTime(): String {
val time = SimpleDateFormat("dd/M/yyyy hh:mm:ss")
return time.format(Date())
}
}
和工人的开始
private fun setPeriodicWorkRequest() {
val downloadConstraints = Constraints.Builder()
.setRequiresCharging(true)
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
val periodicWorkRequest = PeriodicWorkRequest
.Builder(DownloadingWorker::class.java, 15, TimeUnit.MINUTES)
.setConstraints(downloadConstraints)
.build()
WorkManager.getInstance(applicationContext).enqueueUniquePeriodicWork(
"DownloadWorker",
ExistingPeriodicWorkPolicy.KEEP,
periodicWorkRequest
)
}
我在活动中单击按钮时调用上述函数。
我不确定为什么在 10 分钟后的一段时间后我会自动收到此异常。
提前致谢。请帮助我确定原因,并请让我知道我这边的任何意见。
【问题讨论】:
-
尝试了您的代码,但无法重现问题
标签: android kotlin kotlin-coroutines android-workmanager