Ответ
В Android есть несколько способов для периодической асинхронной работы:
- Handler + Runnable – простой способ для выполнения кода с задержкой или периодически в основном потоке.
val handler = Handler(Looper.getMainLooper())
val runnable = object : Runnable {
override fun run() {
// Код для выполнения
handler.postDelayed(this, 1000) // Повтор каждую секунду
}
}
handler.post(runnable)
- WorkManager – для отложенных или периодических фоновых задач, даже после перезапуска приложения.
val periodicWork = PeriodicWorkRequestBuilder<MyWorker>(1, TimeUnit.HOURS).build()
WorkManager.getInstance(context).enqueue(periodicWork)
- AlarmManager – для точного планирования задач, включая пробуждение устройства.
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
val intent = Intent(context, MyReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0)
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 60000, pendingIntent)
- Coroutines + Timer – для периодических задач в корутинах.
viewModelScope.launch {
timer(period = 1000L) {
// Код для выполнения каждую секунду
}
}
Для Android 12+ учитывайте ограничения на фоновую работу (Foreground Service, точные алёрмы и т.д.).