android开发 倒计时和计时的实现

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

在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢?

在最近的一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是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);  
                }  
            }  
        });  
    }  
};  

}

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

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

———————–2016年9月6日09:49:17————————————
后来采用:

package com.zyl.vincent.utils;

import android.content.Context;
import android.os.CountDownTimer;
import android.widget.TextView;

import com.zyl.vincent.R;

/**
 * 获取验证码的倒计时
 * Created by Vincent on 2016/9/6.
 */

public class TimeCount extends CountDownTimer {

    private TextView tv;
    private Context c;

    /**
     * 初始化,构造函数
     * @param context 上下文对象
     * @param millisInFuture 总的时间
     * @param countDownInterval 一般设置为1000,一秒钟减1
     * @param textView 需要设置倒计时的对象
     */
    public TimeCount(Context context,long millisInFuture, long countDownInterval, TextView textView) {
        super(millisInFuture, countDownInterval);
        this.tv = textView;
        this.c=context;
    }

    @Override
    public void onTick(long l) {//计时开始
        tv.setClickable(false);//设置不可点击
        tv.setTextColor(c.getResources().getColor(R.color.common_color_red));
        tv.setText(l / 1000 + "s");
    }

    @Override
    public void onFinish() {
        tv.setText("再次获取");
        tv.setClickable(true);
    }

}

初始化之后调用start方法启动即可

你可能感兴趣的:(android开发,计时,倒计时,引导页倒计时,android,开发,综合)