如何在Android中优化后台任务

时间:2019-04-10 18:34:27

标签: android android-threading

我有一个需要每分钟从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());
        }

    }
}

0 个答案:

没有答案