WorkManager 一次执行多次 enqueueUniquePeriodicWork()?
WorkManager executing enqueueUniquePeriodicWork() multiple times at once?
我是新手,如果问题措辞不当,请告诉我!我有一个 Android 应用程序,即使 phone 处于锁定状态,它也需要大约每 15 分钟执行一次任务。上下文是:
- 我的目标是 SDK 23 或更高版本
- 任务 1) 获取用户的位置 2) 使用 OKHttpClient 调用 HTTPS API,然后 3) 将结果发送到 Firestore 数据库
我正在使用 WorkManager 来尝试实现这个目标。但是,问题是每次执行时,它执行 8-9 次并且时间非常不规则。我可以从 Firestore 条目和 Logcat 中看到这一点。
WorkManager 是否是执行此任务的正确方法?我正在使用
implementation "androidx.work:work-runtime:2.0.1"
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.ExistingPeriodicWorkPolicy;
我看到其他人遇到过这个问题:Android Worker execute the job multiple times
//In MainActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(
PeriodicReadings.class, 15, TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
//In PeriodicReadings.java:
@NonNull
@Override
public Result doWork() {
getReadings(); //work to be done
return Result.success();
}
我希望每 15 分钟在 Firestore 数据库中出现一个读数,但我却看到 8 - 9 个读数的批次以不规则的间隔出现,每 15 分钟 - 2 小时变化一次。
我已尝试清理并重建、使缓存失效并重新启动,并在 phone 上重新加载应用程序。
您在 Activity#onCreate() 中对工作进行排队,因此每次创建 activity 时,您都会对新的 WorkRequest 进行排队。这就是为什么您会看到工作请求的多个实例。您可能需要 enqueueUniquePeriodicWork() API。
这不是最好的方法,但如果您在开始 WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
之前取消所有工作经理任务会更好
或
检查队列中是否已经有 Workmanager
然后不要在 OnCreate
中再次启动它。
试试这个:
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR",ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
KEEP:如果之前的 worker 存在,您的新尝试将被简单地忽略,否则您的新 worker 将被排队。
REPLACE:如果之前的 worker 存在,它将被取消,导致它的状态为 CANCELED。然后,否则,您的新工作人员已入队。
我是新手,如果问题措辞不当,请告诉我!我有一个 Android 应用程序,即使 phone 处于锁定状态,它也需要大约每 15 分钟执行一次任务。上下文是: - 我的目标是 SDK 23 或更高版本 - 任务 1) 获取用户的位置 2) 使用 OKHttpClient 调用 HTTPS API,然后 3) 将结果发送到 Firestore 数据库
我正在使用 WorkManager 来尝试实现这个目标。但是,问题是每次执行时,它执行 8-9 次并且时间非常不规则。我可以从 Firestore 条目和 Logcat 中看到这一点。
WorkManager 是否是执行此任务的正确方法?我正在使用
implementation "androidx.work:work-runtime:2.0.1"
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkManager;
import androidx.work.ExistingPeriodicWorkPolicy;
我看到其他人遇到过这个问题:Android Worker execute the job multiple times
//In MainActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(
PeriodicReadings.class, 15, TimeUnit.MINUTES).build();
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
//In PeriodicReadings.java:
@NonNull
@Override
public Result doWork() {
getReadings(); //work to be done
return Result.success();
}
我希望每 15 分钟在 Firestore 数据库中出现一个读数,但我却看到 8 - 9 个读数的批次以不规则的间隔出现,每 15 分钟 - 2 小时变化一次。
我已尝试清理并重建、使缓存失效并重新启动,并在 phone 上重新加载应用程序。
您在 Activity#onCreate() 中对工作进行排队,因此每次创建 activity 时,您都会对新的 WorkRequest 进行排队。这就是为什么您会看到工作请求的多个实例。您可能需要 enqueueUniquePeriodicWork() API。
这不是最好的方法,但如果您在开始 WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
或
检查队列中是否已经有 Workmanager
然后不要在 OnCreate
中再次启动它。
试试这个:
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR",ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
KEEP:如果之前的 worker 存在,您的新尝试将被简单地忽略,否则您的新 worker 将被排队。
REPLACE:如果之前的 worker 存在,它将被取消,导致它的状态为 CANCELED。然后,否则,您的新工作人员已入队。