关于CountDownTimer使用,设置页面定时跳转回到主页面

2019-06-17  本文已影响0人  朝阳夕晖蜂蜜

参考:https://blog.csdn.net/qw286502698/article/details/72884712

1、CountDownTimer使用,设置页面定时跳转回到主页面

CountDownTimer是Google提供的一个倒计时工具类,利用这个工具可以很方便的实现倒计时功能。
我在这里提供了一个CountTimer类用于继承CountDownTimer

public class CountTimer extends CountDownTimer {
    private Context context;
    private CurrentTimeListener mCurrentTimeListener;
    /**
     * @param millisInFuture    倒计时总时间(如60S,120s等)
     * @param countDownInterval 渐变时间(每次倒计1s)
     */
    public CountTimer(long millisInFuture, long countDownInterval, Context context) {
        super(millisInFuture, countDownInterval);
        this.context = context;
    }

    /**
     * 定时触发回调
     * @param millisUntilFinished
     */
    @Override
    public void onTick(long millisUntilFinished) {
        if(mCurrentTimeListener!=null){
            mCurrentTimeListener.currentTime(millisUntilFinished);
        }
    }
    /**
     * Callback fired when the time is up.
     */
    @Override
    public void onFinish() {
        context.startActivity(new Intent(context, MainActivity.class));
    }

    public interface CurrentTimeListener{
        void currentTime(long currtenTime);
    }

    public void addCurrentTimeListener(CurrentTimeListener currentTimeListener){
        this.mCurrentTimeListener = currentTimeListener;
    }
}

我们在使用的时候通过BaseActivity中设置定时时长,如果Activity是MainActivity或者指定某一个Acticity不进行定时跳转功能,就要在该Activity通过接口回调去cancle掉计时器功能

 countTimerView.addCurrentTimeListener(new CountTimer.CurrentTimeListener() {
            @Override
            public void currentTime(long currtenTime) {
                if(countTimerView!=null){
                    countTimerView.cancel();
                    Log.e(TAG, "currentTime: "+currtenTime );
                }
            }
        });
public class BaseAcvitity extends AppCompatActivity {
    CountTimer countTimerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base_acvitity);
        //设置时间为10s
        countTimerView = new CountTimer(1000*10,1000,BaseAcvitity.this);
    }

    private void timeStart() {
        new Handler(getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                countTimerView.start();
            }
        });
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                countTimerView.start();
                break;
            default:
                countTimerView.cancel();
                break;
        }
        return super.dispatchTouchEvent(ev);

    }

    @Override
    protected void onResume() {
        super.onResume();
        timeStart();
    }

    @Override
    protected void onDestory() {
        super.onPause();
        if(countTimerView!=null){
            countTimerView.cancel();
        }
    }
}

2、CountDownTimer使用,倒计时功能

CountDownTimer 一步实现最简单的倒计时控件,参考
https://blog.csdn.net/u010126792/article/details/88318919

3、TimerTask计数器,倒计时

Google官方解释TimerTask
A task that can be scheduled for one-time or repeated execution by a Timer.

TimeTask计数器的简单使用

private Timer mTimer = new Timer();
 long time = 0;
//开始计时器
 mBtnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        if(mTimer!=null){
                            mTimer.schedule(mTimerTask,1000,1000);
                        }
                    }
                }).start();

            }
        });
      //关闭计时器
        mBtnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mTimer!=null){
                    mTimer.cancel();
                }
            }
        });

    TimerTask mTimerTask = new TimerTask() {
        @Override
        public void run() {
            time++;
            Message message = new Message();
            message.what = 1;
            message.obj = time;
            mHandler.sendMessage(message);

        }
    };
    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                mTvTime.setText(String.valueOf(msg.obj));
            }
        }
    };

警告,在开启和结束计数器功能,开启和结束按钮不能多次点击否则会出现异常
java.lang.IllegalStateException: Task already scheduled or cancelled

上一篇下一篇

猜你喜欢

热点阅读