在javaandroid中制作一个间隔计时器

在javaandroid中制作一个间隔计时器,java,android,timer,intervals,Java,Android,Timer,Intervals,我计划使用计时器创建一个间隔应用程序。它应该是最基本的,所以当我理解了基本知识后,我还需要补充一些。我想要实现的是选择一个间隔应该持续的分钟数,以及这个间隔应该持续多少次。就像一个持续1分钟,持续8次的间歇。 问题是哪种定时器最好使用?我在安卓倒计时系统上试过了,它似乎很管用。但是还有更好的吗?我总是建议使用处理程序 与内置类相比,它的工作量稍微多一些,但我发现它的效率要高得多,而且您可以更好地控制它 处理程序是一个类,它将通过特定的循环器/线程处理代码执行。默认情况下,它是在其中创建的线程,否

我计划使用计时器创建一个间隔应用程序。它应该是最基本的,所以当我理解了基本知识后,我还需要补充一些。我想要实现的是选择一个间隔应该持续的分钟数,以及这个间隔应该持续多少次。就像一个持续1分钟,持续8次的间歇。
问题是哪种定时器最好使用?我在安卓倒计时系统上试过了,它似乎很管用。但是还有更好的吗?

我总是建议使用
处理程序

与内置类相比,它的工作量稍微多一些,但我发现它的效率要高得多,而且您可以更好地控制它

处理程序是一个类,它将通过特定的
循环器
/
线程
处理代码执行。默认情况下,它是在其中创建的线程,否则您可以通过将
循环器
传递给
处理程序
构造函数(Looper.getMainLooper())来指定处理程序执行代码的位置

我推荐使用looper的原因是,您具有更高的控制灵活性,因为它比
TimerTask
方法的抽象性稍低

通常,它们对于跨线程执行代码非常有用。例如,用于跨螺纹的管道数据

这两个主要用途是:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    final Handler h = new Handler();
    h.postDelayed(new Runnable()
    {
        private long time = 0;

        @Override
        public void run()
        {
            // do stuff then
            // can call h again after work!
            time += 1000;
            Log.d("TimerExample", "Going for... " + time);
            h.postDelayed(this, 1000);
        }
    }, 1000); // 1 second delay (takes millis)
}
简单使用

或者可以使用消息,这会减少对象的创建。如果您正在考虑高速更新UI等,这将减少垃圾收集器的压力

class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        MyTimers timer = new MyTimers();
        timer.sendEmptyMessage(MyTimers.TIMER_1);
        timer.sendEmptyMessage(MyTimers.TIMER_2);

    }


    public static class MyTimers extends Handler
    {

        public static final int TIMER_1 = 0;
        public static final int TIMER_2 = 1;

        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case TIMER_1:
                    // Do something etc.
                    Log.d("TimerExample", "Timer 1");
                    sendEmptyMessageDelayed(TIMER_1, 1000);
                    break;
                case TIMER_2:
                    // Do another time update etc..
                    Log.d("TimerExample", "Timer 2");
                    sendEmptyMessageDelayed(TIMER_2, 1000);
                    break;
                default:
                    removeMessages(TIMER_1);
                    removeMessages(TIMER_2);
                    break;
            }
        }
    }
}

显然,这不是一个完整的实现,但它应该给您一个领先的开始。

我只想指出一个重要的注意事项,关于使用递归调用实现间隔的方法。如果你正在做的事情需要一定的时间,那么间隔频率将始终大于实时频率。例如,您在一秒钟后调用该方法,然后执行某项操作(可能需要50毫秒),然后在1秒钟后调用该方法。实际频率不是1秒,而是1050ms,更令人困惑的是,根据应用程序执行您真正想做的事情所花费的时间,它可能是随机的。编辑:如果实时频率实际上对您很重要,我建议您使用Timer类和scheduleAtFixedRate方法。@RaphaelC-频率实际上会降低,由于每个间隔较长,因此调用该方法的频率较低。周期增加,但频率降低。1000ms是周期,1/s是频率,如果周期是1050ms,那么频率大约是0.95/sec@RaphaelC,看起来也不是“实时的”,但可以通过一些垃圾处理和其他耗时任务的处理更接近预期的时间间隔。>此类不提供实时保证:它使用Object.wait(long)方法调度任务。@topher217然而,正如您所说,它提供了比上面讨论的递归解决方案更接近实时的行为。此外,“实时”是一个非常广泛的概念,许多人很难同意,尤其是当涉及相对论时。