处理程序和Runnable很慢

时间:2016-06-01 15:17:59

标签: android task handler runnable

我已经解决了我的问题,但我认为我的解决方案不是最好的。

我希望有一个计时器,可以在有限的时间内每秒更改一次文本。我使用Handler和Runnable这样做:

private Handler handler;
private Runnable runnable = new Runnable(){
    private Date timeSinceLastTask;
    @Override
    public void run() {
        remainingTime--;
        if(timeSinceLastTask != null){
            Date timeWokeUp = new Date();
            long hoursSinceSleep = timeWokeUp.getTime() - timeSinceLastTask.getTime();
            if(hoursSinceSleep > 2000){
                Log.e("Error", (int)(hoursSinceSleep/1000) + "sec");
                remainingTime - (int)(hoursSinceSleep/1000));
            }
        }
        Log.e("Tick", "Tack " + remainingTime);
        if(remainingTime > 0){
            updateText();
            timeSinceLastTask = new Date();
            handler.postDelayed(runnable, 1000);
        }else{
            handler.removeCallbacks(runnable);
        }
    }
};

我不得不添加带有日期的部分来计算最后一个任务的执行时间,因为有时候,当设备进入睡眠状态时,我可能需要50秒才能执行下一个任务,因此减慢了倒计时。一秒钟不能超过一秒!

通过我的修复,它很好,但我想知道在睡眠中有时缓慢执行任务的原因是什么。

谢谢!

1 个答案:

答案 0 :(得分:2)

当您使用Timer时,它将绑定到您创建它的线程。这意味着,当您在主线程(UI线程)中创建此Handler时,它执行的runnable必须与其他UI任务一起运行。 可能会也可能不会影响主线程的性能。这取决于您在runnable中运行的任务以及UI的性能。

另一方面,如果您使用Timer,则表示您正在另一个线程上执行此任务。它不会以任何方式影响主线程。另外,Timer可以在执行之前安排延迟,并且每次执行时都可以安排。它可以取消,可以停止,可以继续。管理和控制Handler<?php $result = mysqli_query($con,"SELECT * FROM Persons"); $encrypted_columns = array('password','code', 'first_name'); echo "<table border='1'>"; $i = 0; while($row = $result->fetch_assoc()) { if ($i == 0) { $i++; echo "<tr>"; foreach ($row as $key => $value) { echo "<th>" . $key . "</th>"; } echo "</tr>"; } echo "<tr>"; foreach ($row as $key => $value) { echo "<td>" . (in_array($key,$encrypted_columns))? simple_decrypt($value , "secured") : $value . "</td>"; } echo "</tr>"; } echo "</table>"; mysqli_close($con); ?> 更灵活。