1. 程式人生 > >Android實現計時與倒計時的幾種方法

Android實現計時與倒計時的幾種方法

               

方法一

Timer與TimerTask(Java實現)

public class timerTask extends Activityprivate int recLen = 11private 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 Activityprivate int recLen = 11private 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 Activityprivate int recLen = 11private 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 Activityprivate int recLen = 0private 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 Activityprivate int recLen = 0private 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,綜合了前幾種方法的優點,是最簡的

參考推薦: