Как оптимизировать фоновые задачи в Android
У меня есть приложение, которое должно извлекать данные из Room Database ( Wrapper для SQLite в основном) каждую минуту, чтобы сделать некоторые проверки этих данных.
Я сделал реализацию с обработчиком, который запускает этот асинхронный вызов каждую минуту. Обработчик регистрируется в mainThread, но когда вызывается задача, он отправляет новый поток для запуска этой задачи в фоновом режиме.
Моя проблема заключается в том, что эта операция не должна выполняться, когда приложение не на переднем плане. В идеале обработчик должен запускать задачу, когда приложение возвращается на передний план, и после того, как эта задача завершится, он должен запланировать следующий вызов через 1 минуту.
Но когда я покидаю свое приложение, нажимая кнопку "Домой", открываю другие приложения, я все еще вижу, что мое приложение регистрирует выполнение этой операции.
Моя проблема в том, что я боюсь, что, если запустить 6 или 7 часов, это повлияет на работу телефона. В App нет встроенных замков.
РЕДАКТИРОВАТЬ: есть 3 действия, которые используют этот класс, и это (BackcgroundExecutor) является внутренним классом синглтона. Если я подключу его к жизненному циклу одного из них, мне нужно будет заставить его работать в зависимости от жизненного цикла всех трех, чтобы быть подходящим.
Как бы вы решили эту проблему?
private class BackgroundExecutor implements Runnable {
@Override
public void run() {
Thread temp = new Thread(new Runnable() {
@Override
public void run() {
long time = Calendar.getInstance().getTimeInMillis();
Log.d("DB", time + " inside of Run method");
evaluateTasks();
evaluateComplexTasks();
long nextTime = nextMinute();
handler.postAtTime(new BackgroundExecutor(), nextTime);
}
});
temp.start();
}
void evaluateTasks() {
// Grab tasks
Task[] tasks = dao.primaryDAO().loadTasksForCheck();
LinkedList<Task> tasksToUpdate = new LinkedList<>();
// Evaluate if any of them got data changed
for (Task t: tasks) {
if (t.checkForFieldUpdate()) {
tasksToUpdate.add(t);
}
}
// Re-save those that have
if (tasksToUpdate.size() > 0) {
Task[] temp = new Task[tasksToUpdate.size()];
tasksToUpdate.toArray(temp);
dao.primaryDAO().insertTask(temp);
}
}
void evaluateComplexTasks() {
// Grabs Complex Tasks
ComplexTasks[] complexTasks = dao.primaryDAO().loadComplexTasksForCheck();
LinkedList<ComplexTasks> tasksToUpdate = new LinkedList<>();
// Evaluate if all tasks are completed
for (ComplexTasks t: complexTasks) {
if (t.checkForTaskStatusUpdate()) {
tasksToUpdate.add(t);
}
}
// Re-save those tasks;
if (tasksToUpdate.size() > 0) {
dao.primaryDAO().insertComplexTask((ComplexTasks[]) tasksToUpdate.toArray());
}
}
}