处理程序延迟不统一?

时间:2017-07-27 17:04:02

标签: java android

我的代码运行延迟:

    final Handler handler = new Handler();
    final int delay = 1000; //milliseconds
    handler.postDelayed(new Runnable(){
        public void run(){
            handler.postDelayed(this, delay);
            Log.e("LOG","HIT");
        }
    }, delay);

并接收这些日志声明:

07-27 19:02:00.084 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT
07-27 19:02:02.089 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT
07-27 19:02:03.092 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT
07-27 19:02:25.154 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT
07-27 19:02:26.155 1690-1690/com.example.steinbockapplications.myapplication2 E/LOG: HIT

认为它应该每1000毫秒运行一次,那么这些延迟会怎样?

3 个答案:

答案 0 :(得分:3)

嗨@Johnny Rockex我运行了相同的代码而几乎没有任何修改。

07-27 22:50:19.999 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:21.000 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:22.001 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:23.002 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:24.003 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:25.005 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:26.006 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:27.007 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:28.008 18973-18973/com.jingged.mermaids E/LOG: HIT
07-27 22:50:29.009 18973-18973/com.jingged.mermaids E/LOG: HIT

和代码

final Handler handler = new Handler();
    final int delay = 1000; //milliseconds
    handler.postDelayed(new Runnable(){
        public void run(){
            Log.e("LOG","HIT");
            handler.postDelayed(this, delay);
        }
    }, delay);

实际上你在日志方法之前推迟了它。这应该是run method下的处理程序中的最后一行

答案 1 :(得分:1)

有时Handler存在不一致,如果您希望获得准确的结果,请使用TimerTask

HandlerThread并不能保证您在准确的时间执行。

答案 2 :(得分:1)

如果手机进入睡眠模式,处理程序会因CPU停止而停止。

Handler&当手机处于睡眠状态时,Runnable无法正常工作,您应该查看AlarmManager或使用前台服务。