在Java Android中制作间隔计时器

2022-09-03 03:32:17

我计划使用计时器创建一个间隔应用。它应该是最基本的,所以当我理解了基础知识之后,我必须再添加一些。我想实现的是选择一个间隔应该持续的分钟数,以及这个间隔应该持续多少次。就像一个持续1分钟并持续8次的间隔。问题是哪个计时器最好使用?我已经在Android倒计时计时器上尝试过我,它似乎有效。但是,还有另一种更好的方法吗?


答案 1

我总是建议使用.Handler

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

处理程序是一个类,它将处理在特定/默认的线程上执行代码,它是在其中创建的,否则您可以通过将传递给构造函数来指定处理程序执行其代码的位置,例如 -LooperThreadLooperHandlernew Handler(Looper.getMainLooper());

我之所以推荐循环器,是因为你有更高的控制灵活性,因为它比方法的抽象略低。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;
            }
        }
    }
}

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


答案 2