1

我有一个应用程序需要每分钟从房间数据库(基本上是 SQLite 的包装器)中获取数据来检查这些数据。

我已经用 Handler 实现了每分钟触发这个异步调用。处理程序在 mainThread 上注册,但是当调用任务时,它会分派一个新线程以在后台运行此任务。

我的问题是,当应用程序不在前台时,不需要进行此操作。理想情况下,当应用程序返回前台时,处理程序会触发任务,并且在该任务完成后,它应该在 1 分钟内安排下一次调用。

但是当我通过单击主页按钮离开我的应用程序,打开其他应用程序时,我仍然看到我的应用程序正在制作有关此操作的日志。

我的问题是,如果让它运行 6 或 7 个小时,恐怕会对用户手机造成电池影响。App中没有唤醒锁。

编辑:有 3 个活动使用这个类,这个(BackcgroundExecutor)是单例的内部类。如果我将它连接到一个生命周期,我将不得不根据所有 3 个生命周期使其正常工作。

你会如何解决这个问题?

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());
        }

    }
}
4

0 回答 0