gpt4 book ai didi

android - Workmanager 中唯一的 OneTimeWorkRequest

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:49:00 25 4
gpt4 key购买 nike

我们正在使用 OneTimeWorkRequest 在我们的项目中启动后台任务。

  1. 在应用程序启动时,我们将启动 OneTimeWorkRequest(比如请求 A)
  2. 根据用户的操作,我们启动相同的工作请求 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。这就是他们在发行说明中提到的确切原因。

Add WorkManager.enqueueUniqueWork() API to enqueue unique OneTimeWorkRequests without having to create a WorkContinuation. https://developer.android.com/jetpack/docs/release-notes

最佳答案

编辑 2:

11 月 8 日发行说明:

https://developer.android.com/jetpack/docs/release-notes

Add WorkManager.enqueueUniqueWork() API to enqueue unique OneTimeWorkRequests without having to create a WorkContinuation.

也就是说,alpha11 有这个新的 API 来唯一地将一次性工作加入队列。

我试着改变代码如下:

OneTimeWorkRequest impWork = new OneTimeWorkRequest.Builder(WorkerNotesAttachment.class)
.addTag(RWORK_TAG_NOTES)
.build();
WorkManager.getInstance().enqueueUniqueWork(RWORK_TAG_NOTES, ExistingWorkPolicy.REPLACE, impWork);

我尝试使用 beginUniqueWork API。但它有时无法运行。所以我最终编写了以下函数。

public static boolean isMyWorkerRunning(String tag) {
List<WorkStatus> status = null;
try {
status = WorkManager.getInstance().getStatusesByTag(tag).get();
boolean running = false;
for (WorkStatus workStatus : status) {
if (workStatus.getState() == State.RUNNING
|| workStatus.getState() == State.ENQUEUED) {
return true;
}
}
return false;

} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return false;
}

我们需要获取所有的 WorkStatus 对象并检查其中是否至少有一个处于运行或入队状态。由于系统会将所有已完成的作品保存在数据库中几天(引用 pruneWork()),我们需要检查所有的作品实例。

在启动 OneTimeWorkRequest 之前调用此函数。

public static void startCacheWorker() {

String tag = RWORK_TAG_CACHE;

if (isMyWorkerRunning(tag)) {
log("worker", "RWORK: tag already scheduled, skipping " + tag);
return;
}
// Import contact for given network
OneTimeWorkRequest impWork = new OneTimeWorkRequest.Builder(WorkerCache.class)
.addTag(tag)
.build();
WorkManager.getInstance().enqueue(impWork);
}

关于android - Workmanager 中唯一的 OneTimeWorkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51724971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com