我有一个应用程序需要每分钟从房间数据库(基本上是 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());
}
}
}