Android 倒計時的控制

一、問題複雜性的由來

需求是這樣的

這裏寫圖片描述

倒計時模塊需要用這樣的格式來顯示出來,xx天xx時xx分xx秒, 看起來也沒有什麼複雜性,但是問題來了,後臺說他只能給我結束時間和當前的時間,剩餘時間需要我自己去計算,我也是醉了,本來倒計時這個東西我就得搗鼓半天,你還得讓我去算剩餘時間,心裏瞬間一萬隻那個什麼馬在飛奔啊,這本來就是後臺的活啊。。。

二、設計思路

  1. 把後臺給出的開始時間和結束時間,轉換爲Java的Date類型
  2. 計算出剩餘時間,轉換爲毫秒級別
  3. 用線程進行倒計時,毫秒遞減1000
  4. 依次計算出日、時、分、秒、
  5. 統一設置到界面上
  6. 線程中發消息進行界面更改

三、實現過程

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

四、總結

過程還不算曲折,總算結束了後臺給帶來的壓力。其實開發中有很多不可預見的問題,有時候我們就是這麼簡單的把這個需求完成了,下個需求可能就由於各種因素導致各種問題,從容面對,見多識廣方可應付自如啊。。。

發佈了29 篇原創文章 · 獲贊 9 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章