Android 工作管理器:如何每月将作业排入队列一次

问题描述 投票:0回答:3

在这个问题之后,我研究了Android作业调度,如果我想每月做一次某事,工作管理器似乎是最新的工具。我构建了一个 Worker 类并在我的活动中使用此代码片段激活它:

PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MonthlyWorker.class, 20, TimeUnit.MINUTES) .build(); WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);

虽然我成功测试了 20 分钟时间段,但存在一个问题:没有可用的月份时间单位,只有天。由于明显的原因,每 30 天执行一次这项工作是行不通的,因为我需要在每个月的第一天执行该任务。所以我该怎么做?我必须使用不同的 API 吗?谢谢。

我可以做类似

if (dayOfMonth==1) do Function

的事情,但我认为这破坏了调度程序的目的。

android android-workmanager periodic-task timeunit
3个回答
5
投票
您只需几分钟即可完成:

只需将天转换为分钟:

此处:

30 天 = 43200 分钟 = 1 个月

PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MonthlyWorker.class, 43200, TimeUnit.MINUTES) .build(); WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);

更新:

根据我的要求,我想在上午 8 点到下午 6 点之间每

30 分钟 执行一次任务 在那位工人的帮助下,我按照您的要求为您制作了

每月 1 日上午 12 点至凌晨 2 点

,如下: public class TestWorker extends Worker { private static final String DEFAULT_START_TIME = "00:01"; //12:01 am private static final String DEFAULT_END_TIME = "03:00"; // 03:00 am private static final String TAG = "TestWorker"; public TestWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); } @NonNull @Override public Result doWork() { /** * Its for time */ DateFormat dateFormat = new SimpleDateFormat("HH:mm", Locale.getDefault()); /** * Get Current Calendar Instance */ Calendar c = Calendar.getInstance(); // Get current day of month int day = c.get(Calendar.DAY_OF_MONTH); /** * Get current time and compare with our start and end date. */ Date date = c.getTime(); String formattedDate = dateFormat.format(date); try { Date currentDate = dateFormat.parse(formattedDate); Date startDate = dateFormat.parse(DEFAULT_START_TIME); Date endDate = dateFormat.parse(DEFAULT_END_TIME); /** * This condition will check that day is 1, and time interval in between give time. */ if (day == 1 && currentDate.after(startDate) && currentDate.before(endDate)) { // Do your work here } } catch (ParseException ignored) { } return Result.success(); } }

您可以以 X 小时的间隔开始此测试工作,这样它就会每 X 小时检查一次(例如,在您的情况下,您可以给 2 小时,这样它就会每两个小时检查一次)

我不知道是否会影响性能,但我认为没有其他解决方案。

您可以按如下方式启动worker:

PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 2, TimeUnit.HOURS) .addTag("MYWORK") .build(); WorkManager.getInstance().enqueueUniquePeriodicWork("MYWORK", ExistingPeriodicWorkPolicy.REPLACE, periodicWork);

希望能有所帮助。


1
投票

Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, 0); c.set(Calendar.DAY_OF_MONTH, 1); String monthfirst = format.format(c.getTime()); System.out.println("===============nowfirst:" + monthfirst);

如果是真的,你就可以做一份真正的工作了。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.