如何在工作管理器中管理2个不同的Android定期任务

时间:2018-08-28 07:53:30

标签: android android-jetpack

我想安排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分钟之前,我将打开应用程序。所以在这里我想检查任务是否没有运行,只有它应该在我每次打开应用程序时都不执行

  1. 它也称为wifiWorkBuilder(每15分钟执行一次的任务),每次打开应用程序时也会被调用。这两个任务是完全不同的,彼此之间并不相互依赖,但是如果一个任务被调用而另一个任务也将在指定的时间之前被调用。

上面的代码有什么问题。任何建议将不胜感激。谢谢

1 个答案:

答案 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   当其某些任务为RUNNINGENQUEUED时。

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,如果您的每个任务都很重要,则工作经理将在完成后自动开始下一个工作。