在Java android中创建一个间隔计时器

Han*_*rik 15 java android timer intervals

我计划使用计时器创建间隔应用程序.它应该是最基本的所以当我理解基础知识时,我将不得不添加更多.我想要实现的是选择一个间隔应该持续的分钟数,但是这个间隔应该多少次.就像持续1分钟并且持续8次的间隔.问题是最好使用哪个计时器?我在Android倒计时器上尝试了我,它似乎工作.但还有另外一个更好吗?

Chr*_*ins 48

我总是建议使用Handler.

它比内置类更多的工作,但我发现它的效率更高,你可以更好地控制它.

该处理器是将在一个特定的处理代码执行的类Looper/ Thread默认情况下,它是在创建线程,否则,你可以指定处理程序通过在经过对其执行代码LooperHandler构造一样-new Handler(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)
}
Run Code Online (Sandbox Code Playgroud)

简单使用!

或者您可以使用消息来减少对象创建.如果您正在考虑高速更新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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这不是一个完整的实现,但它应该给你一个良好的开端.

  • 我只想指出一个关于这种用递归调用实现间隔的方法的重要说明.如果你正在做的事情需要一定的时间,那么intervall频率将始终大于实时频率.例如,您在一秒钟后调用该方法,然后您执行某些操作(可能需要50毫秒),然后在1秒后重新调用该方法.实际频率不是1秒,它变成1050毫秒,甚至更混乱可能是随机的,这取决于应用程序执行你真正想要做的事情所花费的时间. (2认同)