我想安排2个不同的定期任务,为此,我正在使用工作管理器。 1.每20分钟将文件上传到服务器 2.每隔15分钟调用一次API-
对于API调用(每日操作),以下是我的代码:
PeriodicWorkRequest.Builder dailyWorkBuilder =
new PeriodicWorkRequest.Builder(CheckAccount.class, 15,
TimeUnit.MINUTES)
.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
PeriodicWorkRequest DailyJob = dailyWorkBuilder.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("DailyJob", ExistingPeriodicWorkPolicy.REPLACE,DailyJob);
要上传文件,我正在使用以下代码:
PeriodicWorkRequest.Builder wifiWorkBuilder =
new PeriodicWorkRequest.Builder(FileUpload.class, 20,
TimeUnit.MINUTES)
.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
PeriodicWorkRequest wifiWork = wifiWorkBuilder.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("wifiJob", ExistingPeriodicWorkPolicy.REPLACE,wifiWork);
现在我在这里面临两个困难: 1.如果我打开应用程序-假设在打开应用程序后,我的活动是HomeActivity,在此活动中,我编写的dailyWorkBuilder代码(每20分钟执行一次)将在每次打开应用程序时调用。如果我没有打开应用程序,它将在20分钟后调用,但在20分钟之前,我将打开应用程序。所以在这里我想检查任务是否没有运行,只有它应该在我每次打开应用程序时都不执行
上面的代码有什么问题。任何建议将不胜感激。谢谢
答案 0 :(得分:0)
几天前,我遇到了同样的问题。我通过-
如果尚未计划工作管理器,则计划工作。
在您设置工作的MainActivity中。
if(isWorkScheduled("DailyJob")){
// now schedule DailyJob
}
我还问了一个问题,并 answered after getting solution 。
private boolean isWorkScheduled(String tag) { WorkManager instance = WorkManager.getInstance(); if (instance == null) return false; LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag); return statuses.getValue() != null && statuses.getValue().size() > 0; }
如果您考虑以下方法,这取决于您。它将返回true 当其某些任务为
RUNNING
或ENQUEUED
时。private boolean isWorkScheduled(String tag) { WorkManager instance = WorkManager.getInstance(); if (instance == null) return false; LiveData<List<WorkStatus>> statuses = instance.getStatusesByTag(tag); if (statuses.getValue() == null) return false; boolean running = false; for (WorkStatus workStatus : statuses.getValue()) { running = workStatus.getState() == State.RUNNING | workStatus.getState() == State.ENQUEUED; } return running; }
WorkManager
对象为null,因为在某些情况下它可以为null。您可以看到文档。* @return The singleton instance of {@link WorkManager}; this may be {@code null} in unusual * circumstances where you have disabled automatic initialization and have failed to * manually call {@link #initialize(Context, Configuration)}.
ExistingPeriodicWorkPolicy.KEEP
代替ExistingPeriodicWorkPolicy.REPLACE
,如果您的每个任务都很重要,则工作经理将在完成后自动开始下一个工作。