【发布时间】:2019-01-14 10:29:20
【问题描述】:
我们正在使用 OneTimeWorkRequest 在我们的项目中启动后台任务。
- 在应用程序启动时,我们正在启动 OneTimeWorkRequest(比如 req A)
- 取决于用户的操作,我们启动相同的工作请求 A。
在某些情况下,如果应用在工作请求 A 正在进行时被终止,Android 会在应用重新启动时自动重新启动请求 A。我们也再次开始请求 A。所以请求 A 的两个实例并行运行并导致死锁。
为了避免这种情况,我在 app start 中执行了以下代码来检查 worker 是否正在运行,但这总是返回 false。
public static boolean isMyWorkerRunning(String tag) {
List<WorkStatus> status = WorkManager.getInstance().getStatusesByTag(tag).getValue();
return status != null;
}
有没有更好的方法来处理这个问题?
我检查了 beginUniqueWork()。如果我只有一个请求,成本会更高吗?
编辑 2: 这个问题是关于独特的一次性任务。为了启动独特的定期任务,我们有一个单独的 API enqueueUniquePeriodicWork()。但是我们没有用于开始独特的一次性工作的 API。我很困惑在延续对象或手动检查和启动方法之间使用。
在最近的构建中,他们的 Android 为这个 enqueueUniqueWork() 添加了新的 api。这就是他们在发行说明中提到的确切原因。
添加 WorkManager.enqueueUniqueWork() API 以使唯一队列入队 OneTimeWorkRequests 无需创建 WorkContinuation。 https://developer.android.com/jetpack/docs/release-notes
【问题讨论】:
-
你为什么要重新运行任务,你不应该开火然后忘记吗?
-
不,OneTimeWorkRequest 只是一次性触发。我们不会定期运行此工作器。我在应用程序重新启动期间运行此工作程序,因为应用程序不知道应用程序没有运行多少时间。该工作人员用于与电话簿内容同步。
-
@Khemraj 我的问题是关于如何唯一地启动 OneTimeWorkRequest()。这包含在较新的版本中。请检查我的编辑。
标签: android android-architecture-components android-jetpack android-workmanager