我有一个需要每分钟从Room Database(基本上是SQLite的Wrapper)中获取数据的应用程序,以对该数据进行一些检查。
我已经用Handler实现了,它每分钟都会触发一次异步调用。处理程序在mainThread上注册,但是在调用task时,它调度一个新线程在后台运行此任务。
我的问题是,当应用程序不在前台时,不需要执行此操作。理想情况下,处理程序会在应用返回到前台时触发任务,并且在该任务完成后,应在1分钟内安排下一次调用。
但是,当我通过单击“主页”按钮离开我的应用程序,打开其他应用程序时,仍然看到我的应用程序正在记录有关此操作已完成的日志。
我的问题是,如果让它运行6或7个小时,恐怕这会对用户的手机电池造成影响。应用程序中没有唤醒锁。
编辑:有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());
}
}
}