- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们正在使用 OneTimeWorkRequest 在我们的项目中启动后台任务。
在某些情况下,如果应用程序在工作请求 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/
我们正在使用 OneTimeWorkRequest 在我们的项目中启动后台任务。 在应用程序启动时,我们将启动 OneTimeWorkRequest(比如请求 A) 根据用户的操作,我们启动相同的工作
我有一个场景,我必须在特定时间使用 WorkManager 向用户发出通知。 我如何在特定时间安排工作,即使用户强制终止应用程序,它也应该显示。或应用未运行。 我当前的代码如下: Data d = n
更新(2019 年 11 月 21 日) WorkManager.getInstance(activity).enqueueUniquePeriodicWork("test_work",
我正在学习 Kotlin WorkManager 的 Google Codelabs Android 基础知识。我曾看过以一种方式编写的代码,后来又以另一种方式查看它,想知道这两者之间是否存在根本区别
我有以下的一次性 worker 。 // Create a Constraints that defines when the task should run Constraints constrai
我的目标 当我的开关被激活时,每早上 8 点收到一个通知 当前结果 - 如果我第一次激活开关,我每次启动应用程序时都会收到通知 - 我也收到通知而无需随时启动应用程序 -另外,我在一天内收到了几条通知
我是一名优秀的程序员,十分优秀!