gpt4 book ai didi

Android 工作管理器 : How to enqueue Jobs once a month

转载 作者:行者123 更新时间:2023-11-29 23:23:09 25 4
gpt4 key购买 nike

正在关注 this question ,我查看了 Android Job Scheduling,如果我想每月做一次事情,Work Manager 似乎是最新的工具。我构建了一个 Worker 类并在我的 Activity 中使用此代码段激活了它:

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

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

我可以做类似 if (dayOfMonth==1) do Function 的事情,但我认为这破坏了调度程序的目的。

最佳答案

您可以自己按分钟完成:

只需将天数转换为分钟数:

此处: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 分钟执行一次任务

在那个 worker 的帮助下,我根据您的要求为您制作了每月 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);

希望对您有所帮助。

关于Android 工作管理器 : How to enqueue Jobs once a month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53901179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com