Apf*_*t23 5 android timeunit periodic-task android-workmanager
遵循这个问题,我研究了 Android 作业调度,如果我想每月做一次某事,工作管理器似乎是最新的工具。我构建了一个 Worker 类,并在我的活动中使用以下代码片段激活它:
PeriodicWorkRequest myWorkRequest =
new PeriodicWorkRequest.Builder(MonthlyWorker.class, 20, TimeUnit.MINUTES)
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("my fancy test",ExistingPeriodicWorkPolicy.KEEP, myWorkRequest);
Run Code Online (Sandbox Code Playgroud)
虽然我成功测试了 20 分钟时间段,但存在一个问题:没有可用的月份时间单位,只有天数。由于明显的原因,每 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);
Run Code Online (Sandbox Code Playgroud)
根据我的要求,我想在上午 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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以以 X 小时的间隔开始此测试工作,这样它就会每 X 小时检查一次(例如,在您的情况下,您可以给 2 小时,这样它就会每两个小时检查一次)
我不知道是否会影响性能,但我认为没有其他解决方案。
您可以按如下方式启动工作人员:
PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 2, TimeUnit.HOURS)
.addTag("MYWORK")
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("MYWORK", ExistingPeriodicWorkPolicy.REPLACE, periodicWork);
Run Code Online (Sandbox Code Playgroud)
希望它会有所帮助。
| 归档时间: |
|
| 查看次数: |
2316 次 |
| 最近记录: |