今天整理了一下实现计时器的常用方式,有下面几种:
排序 | 组合方式 | 附注 |
1 | Timer+TimerTask | |
2 | Timer+TimerTask+Handler | |
3 | Handler | |
4 | Handler+Thread | |
5 | Handler+Runnable | |
6 | CountDownTimer | 官方提供的倒计时器,推荐使用。 |
目录
1、Timer+TimerTask
2、Timer+TimerTask+Handler
3、Handler
4、Handler+Thread
5、Handler+Runnable
6、CountDownTimer
源码
public class TimerTaskActivity extends Activity{
private int recLen = 11;
private TextView txtView;
Timer timer = new Timer();
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
timer.schedule(task, 1000, 1000); // timeTask
}
TimerTask task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() { // UI thread
@Override
public void run() {
recLen--;
txtView.setText(""+recLen + "s");
if(recLen < 0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
});
}
};
}
public class timerTaskHandlerActivity extends Activity{
private int recLen = 11;
private TextView txtView;
Timer timer = new Timer();
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
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);
}
};
}
public class HandlerActivity extends Activity{
private int recLen = 11;
private TextView txtView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);
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);
}
};
}
public class ThreadHandlerActivity 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) {
}
}
}
}
}
public class RunnableHandlerActivity 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() {
runOnUiThread(new Runnable() { // UI thread
@Override
public void run() {
recLen++;
txtView.setText("" + recLen);
handler.postDelayed(this, 1000);
}
});
}
};
}
TimeCount.java:(PS:直接复制到你的项目中即可)
public class TimeCount extends CountDownTimer {
public static final int SHOW_DETAIL = 0;//HH:mm:ss
public static final int SHOW_NORMAL = 1;//ss
private SimpleDateFormat detailsf = new SimpleDateFormat("HH:mm:ss");
private TextView timerText;
private Context context;
private boolean onTick = false;
private int type;
private TextView textButton;
/**
* @params millisInFuture 计时总时长(单位毫秒)
* @params countDownInterval 计时间隔(单位毫秒)
* @params timerText 显示计时信息的textView
* @params type 指定显示样式:“ss”或者“HH:mm:ss”
*/
public TimeCount(Context context, long millisInFuture, long countDownInterval, TextView timerText, int type) {
super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
this.timerText = timerText;
this.context = context;
this.type = type;
if(type == SHOW_DETAIL){
detailsf.setTimeZone(TimeZone.getTimeZone("UTC"));
}
}
public TimeCount changeButtonStatus(TextView textButton) {
this.textButton = textButton;
return this;
}
@Override
public void onFinish() {//计时完毕时触发
if (textButton == null) {
if (onTick) {
timerText.setText("重新发送");
timerText.setEnabled(true);
onTick = false;
}
} else {
if (!textButton.isEnabled())
textButton.setEnabled(true);
}
}
@Override
public void onTick(long millisUntilFinished) {//计时过程显示
String str = null;
switch (type) {
case SHOW_DETAIL:
Date date = new Date(millisUntilFinished);
str = detailsf.format(date);
break;
case SHOW_NORMAL:
timerText.setEnabled(false);
str = millisUntilFinished / 1000 + "s";
break;
}
onTick = true;
timerText.setText(str);
}
public boolean isOnTick() {
return onTick;
}
}
TickActivity.java:
public class TickActivity extends AppCompatActivity {
private TextView getCode;
private TextView dateLimit;
private TimeCount timer;//计时器
private TimeCount timer2;//计时器
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tick);
initWidget();
initTicker();
}
//初始化控件
private void initWidget(){
getCode = findViewById(R.id.getCode);
dateLimit = findViewById(R.id.dateLimit);
getCode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timer.start();//计时器开始计时
/*发起网络请求获取短信*/
}
});
}
//初始化计时器
private void initTicker(){
/*为了演示,此处定义时限为10s*/
timer = new TimeCount(this, 10000, 1000, getCode, TimeCount.SHOW_NORMAL);
/*活动倒计时1天*/
timer2 = new TimeCount(this, 86400000, 1000, dateLimit, TimeCount.SHOW_DETAIL);
timer2.start();//计时器开始计时
}
/*停止计时*/
public void stopTimer(){
if(timer.isOnTick())
timer.onFinish();
if(timer2.isOnTick())
timer2.onFinish();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopTimer();
}
}
运行效果:
感谢网友分享:https://blog.csdn.net/lanxingfeifei/article/details/51769740