一、問題複雜性的由來
需求是這樣的
倒計時模塊需要用這樣的格式來顯示出來,xx天xx時xx分xx秒, 看起來也沒有什麼複雜性,但是問題來了,後臺說他只能給我結束時間和當前的時間,剩餘時間需要我自己去計算,我也是醉了,本來倒計時這個東西我就得搗鼓半天,你還得讓我去算剩餘時間,心裏瞬間一萬隻那個什麼馬在飛奔啊,這本來就是後臺的活啊。。。
二、設計思路
- 把後臺給出的開始時間和結束時間,轉換爲Java的Date類型
- 計算出剩餘時間,轉換爲毫秒級別
- 用線程進行倒計時,毫秒遞減1000
- 依次計算出日、時、分、秒、
- 統一設置到界面上
- 線程中發消息進行界面更改
三、實現過程
1、計算出剩餘時間,轉換成毫秒級別,封裝的函數如下
public long getRestTime(String endTime,String currTime){
SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
try {
Date endDate=format.parse(endTime);
Date currDate=format.parse(currTime);
long temp = endDate.getTime() - currDate.getTime();
return temp;
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
2、 線程倒計時
class TimerLeftThread extends Thread {
private long leftTime;
TimerLeftThread(long leftTime){
this.leftTime=leftTime;
}
boolean flag = true;
@Override
public void run() {
super.run();
try {
while (flag) {
if (leftTime <= 0) {
flag = !flag;
}
Thread.sleep(1000);
leftTime -= 1000;
handler.post(new Runnable() {
@Override
public void run() {
setRestTime(leftTime);
}
});
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3、根據線程倒計時的結果,轉換爲日、時、分、秒,進行設置界面
public void setRestTime(long rest,String belong){
int days = (int) (rest / (1000 * 60 * 60 * 24));
int hours = (int) ((rest % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
int minutes =(int)(rest % (1000 * 60 * 60)) / (1000 * 60);
int seconds = (int)(rest % (1000 * 60)) / 1000;
String s_tv_day;
String s_tv_hour;
String s_tv_min;
String s_tv_sec;
if(rest>0){
if(days<10){
s_tv_day="0"+days;
}else{
s_tv_day=""+days;
}
if(hours<10){
s_tv_hour="0"+hours;
}else{
s_tv_hour=""+hours;
}
if(minutes<10){
s_tv_min="0"+minutes;
}else{
s_tv_min=""+minutes;
}
if(seconds<10){
s_tv_sec="0"+seconds;
}else{
s_tv_sec=""+seconds;
}
}else{
s_tv_day="00";
s_tv_hour="00";
s_tv_min="00";
s_tv_sec="00";
}
String secLvKillTime = getResources().getString(R.string.sec_kill_time);
String f_KillTime = String.format(secLvKillTime, s_tv_day,s_tv_hour,s_tv_min,s_tv_sec);
tv_lvsec_kill_time.setText(f_KillTime);
tv_lvsec_kill_time.setVisibility(View.VISIBLE);
}
4、 字符串格式化的應用,單獨列出,日常中常用
現在資源文件中這樣定義字符串,設置到界面上
<string name="sec_kill_time">%1$s:%2$s:%3$s:%4$s</string>
然後在得到數據的時候,設置其值
String secLvKillTime = getResources().getString(R.string.sec_kill_time);
String f_KillTime = String.format(secLvKillTime, s_tv_day,s_tv_hour,s_tv_min,s_tv_sec);
tv_lvsec_kill_time.setText(f_KillTime);
四、總結
過程還不算曲折,總算結束了後臺給帶來的壓力。其實開發中有很多不可預見的問題,有時候我們就是這麼簡單的把這個需求完成了,下個需求可能就由於各種因素導致各種問題,從容面對,見多識廣方可應付自如啊。。。