Как оптимизировать фоновые задачи в 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());
        }

    }
}

0 ответов

Другие вопросы по тегам