一. 简介
有时候我们需要倒计时和定时器,这时我们就需要简单易用的CountDownTimer和TimerTask了,下面说下这两位的
不同与相同之处。
CountDownTimer : 典型的倒计时,只需要继承CountDownTimer设置一个时间就可以处理自己的事件了,不需要
自己去关闭计时,倒计时完毕后会执行onFinish(),可以在onTick()和onFinish()中做UI处理。
TimerTask : 每隔一段时间执行一次事件,需要Timer和继承TimerTask,用起来也是很简单,还可以用做倒计时,
和CountDownTimer效果一样,可以调用timerTask.cancel()方法,关闭该计时器,不可以在其中做UI处理。
相同之处 : 都可用做倒计时,简单易用。
不同之处:UI处理地方不一样,关闭方式不一样。
二. 实现简单的倒计时
(1)xml 布局,点击按钮后开启倒计时,TextView显示倒计时的时间
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" /> <TextView android:id="@+id/tv_show_count" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:gravity="center" android:textSize="150dp" android:visibility="invisible" /> </LinearLayout>
(2)使用CountDownTimer代码实现
public class CountDownText extends AppCompatActivity { private Button btnStart; private TextView tvShow; private int num = 10; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.countdown_layout); btnStart = (Button) findViewById(R.id.btn_start); tvShow = (TextView) findViewById(R.id.tv_show_count); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { btnStart.setVisibility(View.INVISIBLE); tvShow.setVisibility(View.VISIBLE); showTimes(); } }); } //倒计时方法,10秒倒计时,每1秒执行一次 public void showTimes() { CountDownTimer showTime = new CountDownTimer(10 * 1000, 1000) { @Override public void onTick(long l) { //倒计时时,在没有完成倒计时时会多次调用,直到结束倒计时 num--; tvShow.setText(num + ""); } @Override public void onFinish() { //倒计时完成时调用 btnStart.setVisibility(View.VISIBLE); tvShow.setVisibility(View.INVISIBLE); } }; showTime.start(); } }
(3)使用TimerTask实现倒计时
public class CountDownText extends AppCompatActivity { private Button btnStart; private TextView tvShow; private int num = 10; private TimerTask timerTask; private static final int tag = 0x11; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case tag: num--; tvShow.setText(num + ""); if (num == 0) { timerTask.cancel(); tvShow.setVisibility(View.INVISIBLE); btnStart.setVisibility(View.VISIBLE); } break; } } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.countdown_layout); btnStart = (Button) findViewById(R.id.btn_start); tvShow = (TextView) findViewById(R.id.tv_show_count); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { btnStart.setVisibility(View.INVISIBLE); tvShow.setVisibility(View.VISIBLE); Timer timer = new Timer(true); //需要一个Timer对象 timerTask = new TimerTasks(); //new一个TimerTask对象 //开启TimerTask,参数:timerTask对象,多久后执行(0为马上执行),每隔多久执行一次 timer.schedule(timerTask, 0, 1000); } }); } private class TimerTasks extends TimerTask { @Override public void run() { mHandler.sendEmptyMessage(tag); //需要使用handler来更新UI } } }
都很简单的。
每天进步一点点!