WorkManager一次执行多次enqueueUniquePeriodicWork()吗?

时间:2019-06-20 12:39:41

标签: java android google-cloud-firestore alarmmanager android-workmanager

我对此并不陌生,所以请让我知道问题措辞是否正确!我有一个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个读数。

我尝试清理并重建,使缓存无效并重新启动,还尝试在手机上重新加载应用程序。

3 个答案:

答案 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。否则,您的新工作人员将入队。