我对此并不陌生,所以请让我知道问题措辞是否正确!我有一个Android应用程序,即使手机处于锁定状态,它也大约需要每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数据库中,但是相反,我看到每隔15分钟-2小时不规则的间隔就会出现一批8-9个读数。
我尝试清理并重建,使缓存无效并重新启动,还尝试在手机上重新加载应用程序。
答案 0 :(得分:0)
您正在将工作加入Activity#onCreate()中,因此,每次创建活动时,都会将新的WorkRequest放入队列中。这就是为什么您将看到工作请求的多个实例的原因。您可能需要enqueueUniquePeriodicWork()API。
答案 1 :(得分:0)
这不是最好的方法,但是如果在开始WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
OR
检查队列中是否已经有Workmanager
,然后不要在OnCreate
中再次启动它。
答案 2 :(得分:0)
尝试一下:
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR",ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
保持:如果先前的工作人员存在,则您的新尝试将被忽略,否则您的新工作人员将被排队。
REPLACE:如果先前的工作人员存在,则将其取消,从而导致其状态为CANCELED。否则,您的新工作人员将入队。