欢迎访问宙启技术站
智能推送

Android实现自定义倒计时

发布时间:2023-05-15 12:38:21

在APP中,倒计时是非常重要的功能之一,比如游戏中的倒计时、秒杀活动的倒计时等等,都需要通过程序实现。在Android中实现倒计时功能可以采用两种方法:CountDownTimer和Handler。

1.CountDownTimer方式实现

CountDownTimer是Android自带的一个计时器类,通过onTick和onFinish两个方法分别实现计时过程和倒计时结束时的操作。下面结合一个实例来讲解CountDownTimer的使用方法。

(1)首先创建一个activity,布局XML文件里加入一个TextView用于显示倒计时。activity的代码如下:

public class MainActivity extends AppCompatActivity {

    private TextView tv_count_down;

    private CountDownTimer timer;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv_count_down = (TextView) findViewById(R.id.tv_count_down);

        timer = new CountDownTimer(60*1000, 1000) {

            @Override

            public void onTick(long l) {

                tv_count_down.setText("倒计时:" + l / 1000 + "秒");

            }

            @Override

            public void onFinish() {

                tv_count_down.setText("倒计时结束");

            }

        };

        timer.start();

    }

}

(2)代码解释:创建一个CountDownTimer对象,并重写onTick和onFinish方法用于分别实现计时过程和倒计时结束时的操作。onTick方法的参数为long类型,表示剩余时间的毫秒数。在onTick方法中更新显示倒计时的TextView文本,并在onFinish方法中更新显示倒计时结束的TextView文本。倒计时的总时间为60秒,每隔一秒进行一次倒计时。

(3)效果截图:

 

在60秒的倒计时过程中,TextView会不断更新显示剩余的时间,当时间到了60秒时会显示“倒计时结束”。

2.Handler方式实现

Handler方式实现倒计时比CountDownTimer稍微复杂一些,但也有其应用场景。例如在实现定时任务的过程中,需要不断执行某个操作直到到达指定的时间点,这种情况下就需要采用Handler方式实现倒计时。下面结合一个实例来讲解Handler的使用方法。

(1)创建一个Utility类,该类包含一个静态方法runOnUiThread,用来将指定代码块运行在UI线程中。

public class Utility {

    public static void runOnUiThread(Runnable action) {

        if (Thread.currentThread() != Looper.getMainLooper().getThread()) {

            new Handler(Looper.getMainLooper()).post(action);

        } else {

            action.run();

        }

    }

}

(2)创建一个TimerThread类,该类继承自Thread,并重写run方法实现倒计时过程。代码如下:

public class TimerThread extends Thread {

    private final Handler m_handler;

    private int m_second;

    public TimerThread(Handler handler, int second) {

        m_handler = handler;

        m_second = second;

    }

    @Override

    public void run() {

        while (m_second > 0) {

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            m_second--;

            Utility.runOnUiThread(new Runnable() {

                @Override

                public void run() {

                    m_handler.obtainMessage(0, "倒计时:" + m_second + "秒").sendToTarget();

                }

            });

        }

        Utility.runOnUiThread(new Runnable() {

            @Override

            public void run() {

                m_handler.obtainMessage(0, "倒计时结束").sendToTarget();

            }

        });

    }

}

(3)创建一个activity,布局XML文件里加入一个TextView用于显示倒计时。activity的代码如下:

public class MainActivity extends AppCompatActivity {

    private TextView tv_count_down;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv_count_down = (TextView) findViewById(R.id.tv_count_down);

        final Handler handler = new Handler() {

            @Override

            public void handleMessage(Message msg) {

                tv_count_down.setText((String) msg.obj);

            }

        };

        TimerThread thread = new TimerThread(handler, 60);

        thread.start();

    }

}

(4)代码解释:在activity中创建一个Handler对象,并用TimerThread类实现倒计时过程,然后通过Handler对象更新TextView显示的文本内容。在TimerThread类的run方法中,采用while循环实现倒计时,并在每次减一秒时通过runOnUiThread方法将代码块运行在UI线程中,以更新TextView显示的文本内容。

(5)效果截图:

 

同样是60秒的倒计时过程,TextView也会不断更新显示剩余的时间,当时间到了60秒时会显示“倒计时结束”。

总结:

两种方式均能实现倒计时功能,CountDownTimer实现方式简单,但有一定的灵活性局限性,适用于倒计时时间不变的情况;Handler实现方式复杂,但具有更大的灵活性,能应对更复杂的倒计时场景。