Android_非UI:倒计时 Handler + Timer + CounDownTimer
2016-09-18 19:56
1016 查看
我们在app开发中经常遇到发送验证码后60s倒计时的操作,60s内不可点击,当0s时可以再次点击,同时TextView和计时复位为60S。
TimerTask:定时任务
源码:http://git.oschina.net/AndroidBaseDemo/TimeCountDown
Handler实现倒计时的效果
延迟1s发送消息,接收消息后,先判断count > 0? 是:Button不可点击 + 显示时间 + count–;否:Button可点击 + count = 60 + 显示60s.效果图
为方便观察,时间设为6s。逻辑:
点击button发送消息,handler接收消息后,实现倒计时效果。方法:
sendEmptyMessage (int what): 发送空消息,消息类型是what sendEmptyMessageDelayed (int what, long delayMillis):延迟delayMillis毫秒发送空消息,消息类型是what。
代码:
package com.cqc.timecountdown; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int MSGWHAT = 1; private int CountDown = 60; private Button btn; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); initViews(); } private void initViews() { btn.setOnClickListener(this); } private void findViews() { btn = (Button) findViewById(R.id.btn); tv = (TextView) findViewById(R.id.tv); } //怎么防止重复点击 @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn: handler.sendEmptyMessage(MSGWHAT); break; } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.d("tag", "countDown=" + CountDown); if (msg.what == MSGWHAT) { if (CountDown >= 0) { btn.setEnabled(false);//防止重复点击Button,否则多次点击button:每隔一秒发送消息多次执行 tv.setText(CountDown-- + "s"); handler.sendEmptyMessageDelayed(MSGWHAT, 1000); } else { btn.setEnabled(true); CountDown = 60;//复位,60s倒计时完后可以继续倒计时 tv.setText(CountDown-- + "s"); } } } }; } `Message`还可以存放对象: Message msg= locHander.obtainMessage(); msg.putParcelable("loc", location);
Thread + Handler
延迟1秒的操作用Thread.sleep(1000)来实现,其余不变。if (msg.what == MSGWHAT2) {//Handler + Thread 实现倒计时效果 if (CountDown >= 0) { btn2.setEnabled(false); tv.setText(CountDown-- + "s"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { handler.sendEmptyMessage(MSGWHAT2); } } else { btn2.setEnabled(true); CountDown = 5; tv.setText(CountDown-- + "s"); } }
Timer + TimerTask
Timer:定时器,方法:schedule(…):执行TimerTask:定时任务
代码:
Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() {//ui Thread @Override public void run() { if (CountDown >= 0) { btn3.setEnabled(false); tv.setText(CountDown-- + "s"); }else{ btn3.setEnabled(true); // CountDown = 5;//死循环 } } }); } }, 1000, 1000);//1秒后,每隔1秒改变一次
源码:http://git.oschina.net/AndroidBaseDemo/TimeCountDown
CountDownTimer
方法timer.start(); 开启倒计时 timer.cancel(); 取消倒计时
CountDownTimer是一个
abstract的
class,构造方法中第一个参数是总时间,第二个参数是间隔时间。
private CountDownTimer timer = new CountDownTimer(10 * 1000, 1000) { @Override public void onTick(long millisUntilFinished) { tv.setClickable(false); tv.setText((millisUntilFinished / 1000) + "秒后重新发送验证码"); } @Override public void onFinish() { tv.setText("发送验证码"); tv.setClickable(true); } };
相关文章推荐
- Android项目开发实战—倒计时[Handler,Timer,TimerTask,Message]
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
- Android 定时任务之Timer和Handler实现倒计时效果(附:adapter列表倒计时)
- Android中倒计时项目(handler和timer)
- Android----------Handler和Timer实现倒计时
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 .
- Android按钮屏蔽计时器(handler+TimerTask)
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 .
- Android用Handler+Timer 异步加载
- Android使用Thread+Handler实现非UI线程更新界面 .
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 .
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- handler的使用---如何实现Android计时与倒计时的几种方法
- Android之Handler总结与Timer和TimerTask详解
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- android Timer和TimerTask实现倒计时