在購物網站的促銷活動中一般都有倒計時限制購物時間或者折扣的時間,這些都是如何實現的呢?
在一個安卓客戶端項目中恰好遇到了類似的問題,一開始使用的是Timer與 TimerTask, 雖然此方法通用,但后來考慮在安卓中是否有更佳的方案,于是乎共找到以下五種實現方案,另外還有一種使用CountDownTimer進行計時的方面,我會在單獨的文章中進行介紹
效果如圖:
	
方法一
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);      runnable.run();    }        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,綜合了前幾種方法的優點,是最簡的
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答