android - 工作经理。如何取消附加工作?
问题描述
我正在尝试取消尚未开始的任务。
我的Worker
班级代码:
class TestWork(context: Context, workerParams: WorkerParameters) :
Worker(context, workerParams) {
override fun doWork(): Result {
val data = inputData.getInt(KEY_OBJ, -1)
runBlocking {
for (i in 1..3){
Log.d("MyTag", "testWork: $data")
delay(1000)
}
}
return Result.SUCCESS
}
override fun onStopped() {
super.onStopped()
Log.d("MyTag", "stopped")
}
companion object {
const val KEY_OBJ = "key"
val WORK_NAME = "name"
}
}
运行 3 的代码示例工作并取消第二个。但第二项工作仍在继续。
val data1 = Data.Builder()
.putInt(TestWork.KEY_OBJ, 1)
.build()
val workRequest1 = OneTimeWorkRequest.Builder(TestWork::class.java)
.setInputData(data1)
.addTag("1")
.build()
val data2 = Data.Builder()
.putInt(TestWork.KEY_OBJ, 2)
.build()
val workRequest2 = OneTimeWorkRequest.Builder(TestWork::class.java)
.setInputData(data2)
.addTag("2")
.build()
val data3 = Data.Builder()
.putInt(TestWork.KEY_OBJ, 3)
.build()
val workRequest3 = OneTimeWorkRequest.Builder(TestWork::class.java)
.setInputData(data3)
.addTag("3")
.build()
WorkManager.getInstance().enqueueUniqueWork(
TestWork.WORK_NAME,
ExistingWorkPolicy.APPEND,
workRequest1
)
WorkManager.getInstance().enqueueUniqueWork(
TestWork.WORK_NAME,
ExistingWorkPolicy.APPEND,
workRequest2
)
WorkManager.getInstance().enqueueUniqueWork(
TestWork.WORK_NAME,
ExistingWorkPolicy.APPEND,
workRequest3
)
WorkManager.getInstance().cancelWorkById(workRequest2.id)
如何只取消第二份工作?当第一个被执行时
解决方案
您应该在方法中使用方法isStopped()
调用onWork
Android 开发者峰会上的视频对此进行了解释。大约在演示的第 15 分钟,有一个完整的部分介绍了如何在 WorkManager 中停止工作,其中详细介绍了这些细节
推荐阅读
- typescript - MongoMemoryServer ; 未处理的错误
- css - 超出其定义宽度的元素
- swift - 从 CSV 在 Core Data 中创建 2000 万条记录 - macOS
- java - Spring JpaRepository getOne() for table with PK as String
- python - 是否有任何 Python 方法可以将 base64 编码的字符串转换为 Image
- reactjs - 单击任何图标时如何更新我的反应
- bash - 如何在两个 shell 脚本之间调用函数?
- http - Golang的“net/http”中客户端HTTP请求和服务器HTTP请求有什么区别
- php - Wordpress URL 重写以同步自定义分类和帖子类型
- python - 我需要一些关于如何根据元素频率对列表进行排序的帮助