国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android計時與倒計時實現限時搶購的5種方法

2019-10-22 18:15:29
字體:
來源:轉載
供稿:網友

在購物網站的促銷活動中一般都有倒計時限制購物時間或者折扣的時間,這些都是如何實現的呢?

在一個安卓客戶端項目中恰好遇到了類似的問題,一開始使用的是Timer與 TimerTask, 雖然此方法通用,但后來考慮在安卓中是否有更佳的方案,于是乎共找到以下五種實現方案,另外還有一種使用CountDownTimer進行計時的方面,我會在單獨的文章中進行介紹

效果如圖:

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);      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武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 前郭尔| 保靖县| 高密市| 轮台县| 和平县| 类乌齐县| 佛冈县| 祁阳县| 五大连池市| 富锦市| 阜平县| 建水县| 淮安市| 和田县| 樟树市| 九龙坡区| 永州市| 四川省| 筠连县| 仁布县| 五常市| 广丰县| 怀远县| 垦利县| 漳浦县| 平和县| 余干县| 洮南市| 寿宁县| 图木舒克市| 萨嘎县| 孝昌县| 临桂县| 阜城县| 邯郸市| 卢氏县| 乐山市| 晋城| 丹寨县| 肇东市| 洪洞县|