Android Work Manager: как ставить задания в очередь один раз в месяц

после этого вопроса я заглянул в Android Планирование заданий, и кажется, что Диспетчер работ - это последний инструмент, если я хочу что-то делать раз в месяц. Я создал класс Worker и активировал его с помощью этого фрагмента в своей деятельности:

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, но я думаю, что это подрывает предназначение планировщика.


person Apfelsaft23    schedule 23.12.2018    source источник


Ответы (1)


Вы можете сделать по минутам:

Просто конвертируйте дни в минуты:

Здесь: 30 дней = 43200 минут = 1 месяц

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

ОБНОВИТЬ:

В соответствии с моим требованием я хотел выполнять задачу каждые 30 минут с 8:00 до 18:00.

С помощью этого работника я сделал для вас, как вам требуется, 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);

Надеюсь, это поможет.

person Pratik Butani    schedule 27.05.2019
comment
Спасибо, но не в каждом месяце 30 дней. - person Apfelsaft23; 28.05.2019
comment
Вы хотите это в какой-то конкретный день? - person Pratik Butani; 28.05.2019
comment
да, первого числа каждого месяца. Извините, если вопрос был недостаточно конкретным. - person Apfelsaft23; 28.05.2019
comment
и в какое конкретное время 1 числа каждого месяца? - person Pratik Butani; 28.05.2019
comment
Желательно в самом начале дня, сразу после полуночи. - person Apfelsaft23; 28.05.2019