Android實現計時與倒計時(限時搶購)的幾種方法

openkk 12年前發布 | 423K 次閱讀 Android Android開發 移動開發

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

在最近的一個安卓客戶端項目中恰好遇到了類似的問題,一開始使用的是Timer與 TimerTask, 雖然此方法通用,但后來考慮在安卓中是否有更佳的方案,于是乎共找到以下五種實現方案,最終我使用了方案五完成了此功能.

效果如圖:

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);  
                }  
            }  
        });  
    }  
};  

} </pre>
方法二
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);  
    }  
};  

} </pre>方法三

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);  
    }  
};  

} </pre>方法四

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) {  
            }  

</pre>方法五

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);  
    }  
};  

} </pre>計時與倒計時
方法1,方法2和方法3,都是倒計時
方法4,方法5,都是計時
計時和倒計時,都可使用上述方法實現(代碼稍加改動)

UI線程比較
方法1,方法2和方法3,都是在UI線程實現的計時;
方法4和方法5,是另開Runnable線程實現計時

實現方式比較
方法1,采用的是Java實現,即Timer和TimerTask方式;
其它四種方法,都采用了Handler消息處理

推薦使用
如果對UI線程交互要求不很高,可以選擇方法2和方法3
如果考慮到UI線程阻塞,嚴重影響到用戶體驗,推薦使用方法4,另起線程單獨用于計時和其它的邏輯處理
方法5,綜合了前幾種方法的優點,是最簡的

轉自:http://blog.csdn.net/t12x3456/article/details/7816500

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!