Android计时与倒计时
Android计时与倒计时
CrazyManDF 发表于1年前
Android计时与倒计时
  • 发表于 1年前
  • 阅读 10
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: Android计时与倒计时

方法一

Timer与TimerTask(Java实现)

public class timerTask 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); 
		  if(recLen < 0){ 
			timer.cancel(); 
			txtView.setVisibility(View.GONE); 
		  } 
		} 
	  }); 
	} 
  }; 
}

方法二

TimerTask与Handler(不用Timer的改进型)

public class timerTask 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); 
	} 
  }; 
}

方法三

Handler与Message(不用TimerTask)

public class timerTask 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); 
	} 
  }; 
}

方法四

Handler与Thread(不占用UI线程)

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(最简单型)

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,综合了前几种方法的优点,是最简的
希望本文所述对大家Android程序设计有所帮助。
标签: android 计时器
共有 人打赏支持
粉丝 4
博文 62
码字总数 23547
×
CrazyManDF
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: