利用反射動態改變android倒計時類CountDownTimer的回調頻率


本文為原創文章,歡迎轉載,但請注明出處 http://www.cnblogs.com/yexiubiao/archive/2013/01/02/2842026.html,未在文章頁面明顯位置給出原文連接的,將保留追究法律責任的權利。
 
在開發中可能我們會遇到這樣的需求,
1,界面上有一個倒計時,當倒計時間剩下不多時,時間開始閃動(顏色紅白交替)。如下圖:
 
2,當時間馬上就要結束時,閃動頻率加快,如圖(截圖后有些不流暢,實際運行時很流暢的):
 
 
關於需求1,我們用android自帶的倒計時類CountDownTimer很簡單地實現,只需要實現抽象類CountDownTimer的兩個抽象方法onTick()和onFinish()即可,顏色的話可以用一個標志flag控制交替改變。
代碼:
//3分鍾后到時,每1秒回調一次onTick()
new CountDownTimer(3 * 60 * 1000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
        //在這里改變界面上的時間
    }
 
    @Override
    public void onFinish() {
        //在這里處理時間到了的邏輯
    }
}.start();

 

 
關於需求2,實現起來有點麻煩。
首先看下CountDownTimer的構造方法:
public CountDownTimer(long millisInFuture, long countDownInterval)
構造CountDownTimer時需傳入兩個參數,millisInFuture表示倒計時的時長,countDownInterval表示回調間隔(頻率)。每隔countDownInterval秒會回調一次onTick()方法。我們馬上想到的是 CountDownTimer應該有個setCountDownInterval()方法,可以改變回調間隔countDownInterval的值。但是看了CountDownTimer的源碼后,沒有發現任何可以改變countDownInterval值的方法。而且成員變量mCountdownInterval是私有的。
 
這時候我們可能想到以下幾種實現方案。
方案1:當時間小於指定值時,設置一個標志flag,實現類根據這個flag,重新new一個CountDownTimer,並指定新的回調間隔值countDownInterval。但這樣實現起來很麻煩,每new一次倒計時,都得實現CountDownTimer的抽象方法,如果項目中有n個地方用到倒計時,那就得重新寫n次,不可取。
 
方案2:構造CountDownTimer類的時候傳入的countDownInterval值改為原來的一半,然后在代碼中控制,如果是正常顯示狀態則每隔兩次調用一次onTick()方法,當需要加快回調間隔時,每隔一次回調一次onTick()方法,不過這樣不太靈活,回調間隔只能是原來的整數倍。而且還得控制標志位flag,也不太可取。
 
方案3:反射,利用反射動態地改變CountDownTimer類的私有字段mCountdownInterval,這里我抽取成了一個方法,代碼如下:
privatevoid changeCountdownInterval(long time) {
    try {
    // 反射父類CountDownTimer的mCountdownInterval字段,動態改變回調頻率
    Class clazz = Class.forName("android.os.CountDownTimer");
    Field field = clazz.getDeclaredField("mCountdownInterval");
    field.setAccessible(true);
    field.set(this, time);
    } catch (Exception e) {
        Log.e("Ye", "反射類android.os.CountDownTimer失敗: " + e);
    }
}

 

總結,用方案3的反射實現起來很靈活而且簡單,不好的地方是,反射一般盡量少用,因為既然源碼將mCountdownInterval定義為私有,而且不暴露修改他的值的方法,就一定有他的原因,以后源碼可能會修改私有字段和私有方法,造成反射失效。不過在這里實現方法比較簡單靈活,權衡了一下,還是可以使用,最后附上demo ^_^。
 http://files.cnblogs.com/yexiubiao/YeCountDownTimer.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM