【问题标题】:How to manage 2 diffrent android periodic task in work manager如何在工作管理器中管理 2 个不同的 android 定期任务
【发布时间】:2018-08-28 07:53:29
【问题描述】:

我想安排 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. 如果我打开应用程序 - 假设在打开应用程序后我的 Activity 是 HomeActivity 在这个活动中我编写的 dailyWorkBuilder 代码(每 20 分钟后执行一次)将在我每次打开应用程序时被调用。如果我没有打开应用程序,它将在 20 分钟后被调用,但在 20 分钟之前我打开应用程序它会被调用。所以在这里我想检查任务是否没有运行,那么只有当我打开应用程序时它不应该执行

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

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

【问题讨论】:

    标签: android android-jetpack


    【解决方案1】:

    几天前我遇到了同样的问题。我做到了-

    如果尚未安排工作经理,请安排工作。

    在您设置工作的 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 对象是否为空,因为在某些情况下它可能为空。您可以查看文档。
     * @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,如果您的每一项任务都很重要,工作经理将在完成后自动开始下一项工作。

    【讨论】:

    • 嗨@Khemraj,感谢您的建议,我已经尝试了两种方法 isWorkScheduled(String tag) 但都总是返回 false。第一次它必须返回 false,但下一次它应该返回 true。但每次它只返回false
    • 那你必须找出来。因为getStatusesByTag 按标签返回状态。
    • 你使用和getStatusesByTag()相同的标签来创作作品,对吧。
    • 也可以尝试全新安装,也许那里安排了一些旧工作。
    • 是的,你会找到的。这是对我有用的解决方案。现在检查一项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多