Android如何实现倒计时功能

1.实现逻辑

其实很简单:进入页面的时候,从本地获取现在的时间,从服务器获取结束时间,两者做减法就是剩余的时间,显示在页面上;然后利用handler,每隔一秒发一个信息,再次获取下本地时间,然后两者相减,显示在页面上。

2.进入实战

需求分析:
工作中,很有可能让你做一个页面的listview或者recyclerview,然后在每个item里面添加一个倒计时功能,当然每个item获取的结束时间是不一样的。在这里我们把结束时间设置为固定值,就不在listview或者recyclerview里面做效果了,其实就是不用写adapter和holder了(如果是listview或者recyclerview就在holder中写以下逻辑即可)以及结束时间是从服务器获取的。

3.进入代码:

● 首先创建布局,写一个TextView:

    <TextView
    android:id="@+id/tv_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

● 接着初始化控件(在这里就不用butterknife或者Dragger了):

private void initView() {
    setContentView(R.layout.activity_main);
    time_remaining = (TextView) findViewById(R.id.tv_time);
}

● 然后获取剩余时间,并显示在页面上,接着开启倒计时操作:

  • 获取剩余时间
private void getRemainTime() {
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowtime = dateFormat.format(new Date());
        Date d1 = dateFormat.parse(nowtime);
        Date d2 = dateFormat.parse(endtime);
        long time = d2.getTime() - d1.getTime();
        if (time <= 0) {
            time_remaining.setText("已结束");
     isRun = false;
        } else {
            time_remaining.setText(TimeUtil.formatTime(time));
        }

    } catch (ParseException e) {
        e.printStackTrace();
    }
    startRun();
}
  • 开启倒计时
private void startRun() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (isRun) {
                try {
                    Thread.sleep(1000); // sleep 1000ms
                    Message message = Message.obtain();
                    message.what = 1;
                    timeHandler.sendMessage(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

● 最后创建一个handler,并在handler里面再次获取本地时间,用结束时间减去本地时间,然后显示在页面上

private Handler timeHandler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what == 1) {
            try {
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String nowtime = dateFormat.format(new Date());
                Date d1 = dateFormat.parse(nowtime);
                Date d2 = dateFormat.parse(endtime);
                long time = d2.getTime() - d1.getTime();
                if (time <= 0) {
                    time_remaining.setText("已结束");
                    isRun = false;
                } else {
                    time_remaining.setText(TimeUtil.formatTime(time));
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
};
  • 附上成员变量:
private TextView time_remaining;
private String endtime = "2016-12-30 16:15:00"; //初始化一个结束的时间(项目中从服务器获取)
private static final String TAG = "MainActivity";
private boolean isRun = true;

● 补充:
当结束时间小于本地的时间的时候,这个时候应该修改textview为“已结束”(类似的),并且把isRun 设置为false,严谨的做法而已。
另外添加了一个TimeUtils的工具类,可以把毫秒转化为你想要的格式的时间(自己可以私人定制),代码如下:

public class TimeUtil {

    public static String formatTime(Long ms) {
        Integer ss = 1000;
        Integer mi = ss * 60;
        Integer hh = mi * 60;
        Integer dd = hh * 24;

        Long day = ms / dd;
        Long hour = (ms - day * dd) / hh;
        Long minute = (ms - day * dd - hour * hh) / mi;
        Long second = (ms - day * dd - hour * hh - minute * mi) / ss;
        Long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;

        StringBuffer sb = new StringBuffer();
        if(day > 0) {
            sb.append(day+"天");
        }
        if(hour > 0) {
            sb.append(hour+"小时");
        }
        if(minute > 0) {
            sb.append(minute+"分");
        }
        if(second > 0) {
            sb.append(second+"秒");
        }
        if(milliSecond > 0) {
            sb.append(milliSecond+"毫秒");
        }
        return sb.toString();
    }
}
3.Demo下载地址

链接: http://pan.baidu.com/s/1i5kH63F 密码: 184m

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值