实现一个小功能,用户指定时间未操作界面,提示超时并跳转到登录界面
    ,在DispatchOnTachEvent中调用方法,如:

    1. public boolean dispatchTouchEvent(MotionEvent ev) {
    2. resetTime();
    3. return super.dispatchTouchEvent(ev);
    4. }
    5. /**
    6. * 规定时间内没操作,就超时登录
    7. */
    8. public void resetTime() {
    9. if (timer2 != null) {
    10. timer2.cancel();
    11. timer2 = null;
    12. }
    13. timer2 = new CountDownTimer(10000, 10000) {
    14. @Override
    15. public void onTick(long millisUntilFinished) {
    16. }
    17. @Override
    18. public void onFinish() {
    19. if (isLogView) {
    20. //跳转到登录界面
    21. LoginActivity.statAction(BaseActivity.this, "TIMEOUT");
    22. finish();
    23. }
    24. }
    25. };
    26. timer2.start();

    结果发现不对,即使我在规定的时间了,多次操作了界面,只要到了60s铁跌跳转!
    只能一个解释,cancel并没有成功,计时器仍然在运作.然而,在5.0及以上的系统中,cancel方法就可以起到作用。对比CountDownTimer的源码发现,在5.0中,增加了一个字段:

    1. private boolean mCancelled = false;

    通过mCancelled 标识当前计时器是否取消,然后在handleMessage()中首先对mCancelled进行判断:
    CountDownTimer cancle无效 - 图1
    SB图2
    因此解决方式为自定义一个CountDownTimerUtil,将5.0以上的CountDownTimer源码复制到项目中即可。
    下载地址: 5.0 CountDownTimer 源码
    如果各位觉得有用,请点个赞以示鼓励,谢谢!