Android两种计时器CountDownTimer和TimerTask

一. 简介

有时候我们需要倒计时和定时器,这时我们就需要简单易用的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
        }
    }
}

都很简单的。

每天进步一点点!



猜你喜欢

转载自blog.csdn.net/qq_26446715/article/details/80108991