美文网首页
Android三种超简单办法,实现按钮倒计时

Android三种超简单办法,实现按钮倒计时

作者: 随心随性_0a25 | 来源:发表于2018-06-26 10:22 被阅读0次

    image.png

    1、使用CountDownTimer

    CountDownTimer是android中自带的倒计时类

    需要两个参数,一个是总计时的时间,一般验证码是60秒,就是60*1000。第二个参数是设置计时的速度,1000就是每秒一次。

    如果总长度是10秒,速度是1,那么就是10-9-8-7-6-5-4-3-2-1-0;

    如果总长度是10秒,速度是2,那么就是10-8-6-4-2-0;

    总时间是不变的,如果需要更精确的计时展现,就修改第二个参数。

    在创建对象的时候,需要重写onTick和onFinish的方法。

    onTick就是我们剩余的时间,需要将之转化成秒展示出来。

    在倒计时的过程中把按钮禁用。

    然后在onFinish倒计时结束的时候,按钮启用。

    最后通过.start启动倒计时。

    CountDownTimer timer =newCountDownTimer(10000,1000) {@OverridepublicvoidonTick(longmillisUntilFinished){                mTimer2.setEnabled(false);                mTimer2.setText("已发送("+ millisUntilFinished /1000+")");            }@OverridepublicvoidonFinish(){                mTimer2.setEnabled(true);                mTimer2.setText("重新获取验证码");            }        }.start();

    2、使用线程

    首先需要创建一个主线程,用来接收数据,改变UI

    privateinttime=10;privateHandler mHandler =newHandler() {publicvoidhandleMessage(Message msg){switch(msg.what) {case0:                    setResult(RESULT_OK);                    TimerButtonActivity.this.finish();break;case4:                    mTimer1.setEnabled(false);                    mTimer1.setText("已发送("+ String.valueOf(time) +")");break;case5:                    mTimer1.setEnabled(true);                    mTimer1.setText("重新获取验证码");                    time =10;break;            }        }    };

    运行一个子线程,由于子线程中无法更新UI,所以需要根据time,将当前状态发送到主线程中,在主线程中操作。

    当子线程执行的时候,按钮设置不可点击,并且将线程执行的结果一直发送给主线程,在主线程中动态显示倒计时。

    当time倒计时为0的时候,将time重置,按钮重新设置可点击。

    publicvoidstartTime1(){        Runnable runnable =newRunnable() {@Overridepublicvoidrun(){                time--;if(time <=0) {                    mHandler.sendEmptyMessage(5);                }else{                    mHandler.sendEmptyMessage(4);                    mHandler.postDelayed(this,1000);                }            }        };newThread(runnable).start();    }

    3、使用Timer和TimerTask

    Timer类官方的解释是多个线程共享一个计时器,也就是当使用了方法二之后,再使用三、线程会比开辟出来一部分给当前的线程。

    假设总时间是10秒,点击按钮2,开始倒计时,同时点按钮3,时间会被瓜分掉。

    但是只调用一个线程操作是没问题的。

    privateTimer timer =newTimer();TimerTask task =newTimerTask() {@Overridepublicvoidrun(){            runOnUiThread(newRunnable() {@Overridepublicvoidrun(){                    time--;                    mTimer3.setText("已发送("+ String.valueOf(time) +")");                    mTimer3.setEnabled(false);if(time <=0) {                        mTimer3.setEnabled(true);                        mTimer3.setText("重新获取验证码");                    }                }            });        }    };

    在开始的时候调用

    timer.schedule(task,time, 1000);

    其实还有一些其他的办法:

    比如重写Button按钮,同样需要用到线程,只不过,线程是在自定义button中执行。

    相比来说第一种方法使用CountDownTimer是最简单的了。

    但是具体实现还要看业务上的需求,去寻找最适合的方法。

    源码在GitHub-android-CollectionDemo

    作者:八怪不姓丑

    链接:https://www.jianshu.com/p/6e72527c03af

    來源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

    相关文章

      网友评论

          本文标题:Android三种超简单办法,实现按钮倒计时

          本文链接:https://www.haomeiwen.com/subject/ymspyftx.html