我是个新手,所以如果这个问题措辞不好,请让我知道!我有一个Android应用程序,即使手机处于锁定状态,它也需要大约每15分钟执行一次任务。上下文是:- Im以SDK23或更高版本为目标-任务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小时变化一次。
我已经尝试了清理和重建,使缓存失效并重新启动缓存,以及在手机上重新加载应用程序。
发布于 2020-05-09 09:25:14
试试这个:
WorkManager.getInstance().enqueueUniquePeriodicWork("PWR",ExistingPeriodicWorkPolicy.KEEP, periodicWorkRequest);
KEEP:如果以前的worker存在,您的新尝试将被忽略,否则您的新worker将进入队列。
替换:如果存在以前的工人,它将被取消,导致它的状态为已取消。否则,您的新工作线程将被排入队列。
发布于 2020-05-09 06:58:54
好吧,这不是最好的方法,但是如果你在开始你的WorkManager.getInstance().enqueueUniquePeriodicWork("PWR", ExistingPeriodicWorkPolicy.REPLACE, periodicWorkRequest);
之前取消所有的工作管理器任务会更好
或
检查队列中是否已经有Workmanager
,然后不要在OnCreate
中再次启动它。
发布于 2019-06-21 11:38:25
您将工作放入Activity#onCreate()中,因此每次创建活动时,都会将一个新的WorkRequest排入队列。这就是为什么您将看到工作请求的多个实例。您可能需要enqueueUniquePeriodicWork() API。
https://stackoverflow.com/questions/56686203
复制相似问题