安卓自定义计时器控件的不同方法

安卓自定义计时器控件


方法一
Timer与TimerTask(Java实现)
schedule(TimerTask task, long delay) // 延迟delay毫秒后,执行一次task。
schedule(TimerTask task, long delay, long period) // 延迟delay毫秒后,执行第一次task,然后每隔period毫秒执行一次task。

mTimer.schedule(new TimerTask() {
    @Override
    public void run() {
        Log.d("WelcomeActivity", "当前线程:"+ Thread.currentThread().getName());
        toMain();
    }
},3*1000);

方法二
TimerTask与Handler(不用Timer的改进型)
TimerTask中执行 发送信息的语句, 定义在MainActivity 中的handle 在接收到消息后执行handleMessage()

 private int recLen = 11;
    private TextView txtView;

    private void init() {
        Timer timer = new Timer();
        timer.schedule(task, 1000, 1000);       // timeTask 
        
    }

    final Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            switch (msg.what) {
                case 1:
                    txtView.setText(""+recLen);
                    if(recLen < 0){
                        timer.cancel();
                        txtView.setVisibility(View.GONE);
                    }
            }
        }
    };

    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            recLen--;
            Message message = new Message();
            message.what = 1;
            handler.sendMessage(message);
        }
    };
}  

方法三
Handler与Message(不用TimerTask)
使用sendMessageDelayed()方法。
该方法还是在主线程中进行。

private void init() {
    Message message = handler.obtainMessage(1);     // Message  
    handler.sendMessageDelayed(message, 1000);

}

final Handler handler = new Handler(){  

        public void handleMessage(Message msg){         // handle message  
            switch (msg.what) {  
            case 1:  
                recLen--;  
                txtView.setText("" + recLen);  

                if(recLen > 0){  
                    Message message = handler.obtainMessage(1);  
                    handler.sendMessageDelayed(message, 1000);      // send message  
                }else{  
                    txtView.setVisibility(View.GONE);  
                }  
            }  

            super.handleMessage(msg);  
        }  
    };  

方法四
Handler与Thread(不占用UI线程)
利用sleep()方法

public class timerTask extends Activity{  
    private int recLen = 0;  
    private TextView txtView;  

    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  

        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  

        new Thread(new MyThread()).start();         // start thread  
    }     

    final Handler handler = new Handler(){          // handle  
        public void handleMessage(Message msg){  
            switch (msg.what) {  
            case 1:  
                recLen++;  
                txtView.setText("" + recLen);  
            }  
            super.handleMessage(msg);  
        }  
    };  

    public class MyThread implements Runnable{      // thread  
        @Override  
        public void run(){  
            while(true){  
                try{  
                    Thread.sleep(1000);     // sleep 1000ms  
                    Message message = new Message();  
                    message.what = 1;  
                    handler.sendMessage(message);  
                }catch (Exception e) {  
                }  

方法五
Handler与Runnable(最简单型),
Handler.postDelayed()方法为一种实现多线程方法,通过创建一个Handler对象和一个Runnable对象;使用postDelayed()方法使之从新调用Runnable对象
关闭此定时器:handler.removeCallbacks(runnable);

public class timerTask extends Activity{  
    private int recLen = 0;  
    private TextView txtView;  

    public void onCreate(Bundle savedInstanceState){  
        super.onCreate(savedInstanceState);  

        setContentView(R.layout.timertask);  
        txtView = (TextView)findViewById(R.id.txttime);  

        handler.postDelayed(runnable, 1000);  
    }     

    Handler handler = new Handler();  
    Runnable runnable = new Runnable() {  
        @Override  
        public void run() {  
            recLen++;  
            txtView.setText("" + recLen);  
            handler.postDelayed(this, 1000);  
        }  
    };  
}  

计时与倒计时
方法1,方法2和方法3,都是倒计时
方法4,方法5,都是计时
计时和倒计时,都可使用上述方法实现(代码稍加改动)
UI线程比较
方法1,方法2和方法3,都是在UI线程实现的计时;
方法4和方法5,是另开Runnable线程实现计时
实现方式比较
方法1,采用的是Java实现,即Timer和TimerTask方式;
其它四种方法,都采用了Handler消息处理
推荐使用
如果对UI线程交互要求不很高,可以选择方法2和方法3
如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理
方法5,综合了前几种方法的优点,是最简的
方法六
使用.CountDownTimer类
CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单

public abstract void onTick(long millisUntilFinished);
//这个是每次间隔指定时间的回调,
//millisUntilFinished:剩余的时间,单位毫秒
public abstract void onFinish();
//这个是倒计时结束的回调

注意需要调用.start(),来开启计时。
1.自动处理生命周期,不会发生内存泄漏
2.继承TextView,直接布局使用,样式设置按照TextView设置即可
3.设置点击事件开关,可以实现倒计时期间点击无效(短信验证码)
4.设置序列化操作开关,关闭页面、甚至杀掉app再进倒计时依然正确(短信验证码)
5.可倒计时,可正向计时
6.链式调用,方便快捷
案例

mCountDownTextView.setNormalText("获取验证码")
                .setCountDownText("重新获取(", ")")
                .setCloseKeepCountDown(true)//关闭页面保持倒计时开关
                .setCountDownClickable(true)//倒计时期间点击事件是否生效开关
                .setShowFormatTime(true)//是否格式化时间
                .setOnCountDownFinishListener(new CountDownTextView.OnCountDownFinishListener() {
                    @Override
                    public void onFinish() {
                        Toast.makeText(MainActivity.this, "倒计时完毕", Toast.LENGTH_SHORT).show();
                    }
                })
                .setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(MainActivity.this, "短信已发送", Toast.LENGTH_SHORT).show();
                        mCountDownTextView.startCountDown(60);
                    }
                });
  mCountDownTextView.start();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值