首页 > 解决方案 > 工作经理。如何取消附加工作?

问题描述

我正在尝试取消尚未开始的任务。

我的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)

如何只取消第二份工作?当第一个被执行时

标签: androidandroid-workmanager

解决方案


您应该在方法中使用方法isStopped()调用onWork

Android 开发者峰会上的视频对此进行了解释。大约在演示的第 15 分钟,有一个完整的部分介绍了如何在 WorkManager 中停止工作,其中详细介绍了这些细节


推荐阅读