Это может быть поздняя запись, но вы можете использовать WorkManager в Android для настройки периодического рабочего запроса.
Я использую WorkManager, и кажется, что он работает надежно.
Вы можете прочитать больше о других рабочих примитивах, чтобы удовлетворить вашу задачу здесь , ноПриведенная ниже реализация использует Worker для работы с потоками в WorkManager, который синхронно выполняет работу в фоновом потоке.
public class BackgroundWorker extends Worker {
public BackgroundWorker
(@NonNull Context context,
@NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Worker.Result doWork() {
yourBackgroundTask(); // yourBackgroundTask() implementation
return Result.success();
}
public static void schedulePeriodicWork(Data data) {
// When multiple constraints are specified like below,
// your task will run only when all the constraints are met.
Constraints constraints = new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.setRequiresCharging(true)
.build();
PeriodicWorkRequest taskWork = new PeriodicWorkRequest.Builder(BackgroundWorker.class, 60,
TimeUnit.MINUTES)
.setConstraints(constraints)
.setInputData(data)
.build();
WorkManager.getInstance().enqueue(taskWork);
}
}
Позже в вашем файле MainActivity, внутри onCreate()
:
Data data = workData();
BackgroundWorker.schedulePeriodicWork(data);
Затем вне метода onCreate()
,
private Data workData() {
return new Data.Builder() // to build Data objects
.build();
}
Одна небольшая вещь дляобратите внимание, что хотя мы устанавливаем вышеупомянутую задачу для выполнения каждые 60 минут, каждая итерация может не выполняться в один и тот же интервал времени.
Согласно документации Android, WorkManager предназначен для отложенной работы, и некоторые отклонения должны быть допустимы.Тем не менее, вы можете проверить консоль журнала на наличие обновлений "WM-WorkerWrapper: Worker result SUCCESS for Work
".
Надеюсь, это полезно.