首页 > 解决方案 > 如何清除 Android WorkManager 中查看的 WorkInfo?

问题描述

在使用WorkManager时,遇到了操作状态没有被读取字段删除的问题。

下面是初始化操作

private fun saveCashCommandSchedule() {
    val constraints = Constraints.Builder()
                .setRequiredNetworkType(NetworkType.CONNECTED)
                .build()
    val work = OneTimeWorkRequestBuilder<WorkSynchronizeCashSchedule>()
            .setConstraints(constraints)
            .build()
    WorkManager.getInstance().enqueueUniqueWork("send_cash_schedule", 
    ExistingWorkPolicy.REPLACE, work)
}

这里我连接监听器来跟踪操作的状态

fun subscribeWorkScheduleCash(lifecycle: Lifecycle) {
    WorkManager.getInstance().getWorkInfosForUniqueWorkLiveData("send_cash_schedule").observe({
        lifecycle
    }, { states ->
        states?.forEach {
            if (it != null && it.state == WorkInfo.State.SUCCEEDED) {
                //TODO вот этой строки хотелось бы избежать
               // WorkManager.getInstance().pruneWork()
                loadData()
                return@observe
            }
        }
    })
}

每次连接监听器时,都会弹出旧状态。我需要以某种方式删除它。使用 WorkManager.getInstance().pruneWork() 不是一个选项,因为它会删除所有已完成工作的操作的所有状态。

请告诉我,如何删除状态。

标签: androidkotlin

解决方案


您无需删除或修剪从 workmanager 收到的工作信息数据,因为WorkManager会在一段时间后自动修剪其工作。

pruneWork方法的 JavaDoc 中提到了这一点:

/**
 * Cancels all unfinished work.  <b>Use this method with extreme caution!</b>  By invoking it,
 * you will potentially affect other modules or libraries in your codebase.  It is strongly
 * recommended that you use one of the other cancellation methods at your disposal.
 * <p>
 * Upon cancellation, {@link ListenableWorker#onStopped()} will be invoked for any affected
 * workers.
 *
 * @return An {@link Operation} that can be used to determine when the cancelAllWork has
 * completed
 */
public abstract @NonNull Operation cancelAllWork();

同时,您可以为您想要观察或获取工作信息的工作请求标签保留一个数据库或将标签存储在数据存储(或 sharedpref)中,并且只观察那些并忽略休息。


推荐阅读