Handler postDelayed delayed longer as configured

2019-02-20 03:03发布

I try to develop a simple timer beeper, that peep hourly. For the timing I use a Service and handler, here the example:

    void onStart(...){
        handler.postDelayed(timerRunnable, ONE_HOUR);
    }

    private Runnable timerRunnable = new Runnable() {

    @Override
        public void run() {
               ...beep
               handler.postDelayed(timerRunnable, ONE_HOUR);
        }
    };

but run() method will be fired nondeterministic, I think it is dependent from the current device usage.

I have try the same scenario with TimerTask and with 'manualy' Thread implementation, but with the same nondeterministic result.

2条回答
做个烂人
2楼-- · 2019-02-20 03:43

You'll probably have better luck using the AlarmManager for such a long delay. Handler is best for ticks and timeouts while your app is in the foreground.

http://developer.android.com/reference/android/app/AlarmManager.html

查看更多
倾城 Initia
3楼-- · 2019-02-20 03:51

Android is not a real-time operating system. All postDelayed() guarantees is that it will be at least the number of milliseconds specified. Beyond that will be dependent primarily on what the main application thread is doing (if you are tying it up, it cannot process the Runnable), and secondarily on what else is going on the device (services run with background priority and therefore get less CPU time than does the foreground).

查看更多
登录 后发表回答