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