欢迎使用CSDN-markdown编辑器

来源:互联网 发布:中科院力学研究所知乎 编辑:程序博客网 时间:2024/06/06 14:13

方法一
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,综合了前几种方法的优点,是最简的

0 0