2011-09-18 71 views
4

我搜索了一段時間,但找不到相同的問題。是否可以模擬Android中增加的時間流逝率?

我正在寫一個應用程序,我需要每天安排很多鬧鐘,然後在一天中做不同的事情,而且我很樂意能夠在24分鐘內測試24小時,沿着這些路線。

是否有可能在模擬器或設備上模擬更快的時間流逝?

如果是這樣,這對我來說能夠測試這些東西而不會損失開發時間會很好。事實上,我正在以我認爲可行的方式編寫它們,進行現場測試,然後親自運行該程序以驗證行爲是否正確,但這會大大減慢我的開發時間,以至於不得不等待一天或兩個之間看到一個不好的行爲,然後試圖修復它並重新測試它。任何幫助將不勝感激!

+0

爲什麼你不能在幾秒鐘內安排你的鬧鐘呢? – user432209

+0

然後,我必須有一套調試邏輯和一套真實的邏輯。這種方法適用於小集,我只是想確保我沒有搞砸某些東西,只要調度它們,但是當涉及到測試實際行爲時,如果可能,我想避免這種情況。另一個原因是我想在不同的日子有不同的行爲(想想週末和週末)。我想測試我寫的邏輯,而不是像FORCE_IS_WEEKEND這樣的常量玩。 – Travis

+0

另一個原因 - 我希望能夠測試(通過模擬快速通過的時間),我的鬧鐘應該在「午夜」開始工作。 – Travis

回答

0

如果將所有時間相關的任務抽象爲一個類,則可以將其繼承爲測試類,其中所有系統時間乘以某個常量,並且所有用戶時間除以某個常量。直接調用任何時間依賴的方法,而不是直接調用它通過這個類。

class TimeHandler { 
    protected Context context; 

    public TimeHandler(Context context) { 
     mContext = context; 
    } 

    public long toSystemMillis(long userMillis) { 
     return userMillis; 
    } 
    public long toUserMillis(long systemMillis) { 
     return systemMillis; 
    } 
    public long toSystemDelay(long userDelay) { 
     return userDelay; 
    } 
    public long toUserDelay(long systemDelay) { 
     return systemDelay; 
    } 

    public void setAlarmAt(long userMillis, PendingIntent operation) { 
     long systemMillis = toSystemMillis(userMillis); 
     AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, systemMillis, operation); 
    } 

    public void setAlarmAfter(long userDelay, PendingIntent operation) { 
     long systemDelay = toSystemDelay(userDelay); 
     AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, systemDelay, operation); 
    } 
} // (scroll down) 

class OptimizedTimeHandler extends TimeHandler { 
    protected static final long RATE = 60; // 1 minute -> 1 hour 
    protected static final long START_TIME = Date.UTC(2011,9,18,0,0,0); 

    public TestTimeHandler(Context context) { 
     super(context); 
    } 

    @Override 
    public long toSystemMillis(long userMillis) { 
     return START_TIME + (userMillis - START_TIME)/RATE; 
    } 
    @Override 
    public long toUserMillis(long systemMillis) { 
     return START_TIME + (userMillis - START_TIME)*RATE; 
    } 
    @Override 
    public long toSystemDelay(long userDelay) { 
     return userDelay/RATE; 
    } 
    @Override 
    public long toUserDelay(long systemDelay) { 
     return systemDelay*RATE; 
    } 
} 

UPDATE

你可以使RATESTART_TIME常數爲實例字段。甚至可能是構造函數參數。

用法示例:

TimeHandler th = new TimeHandler(); 
th.setAlarmAt(Date.UTC(2011,9,19,0,0,0), operation); 
// will fire at 2011-09-19 00:00:00 (real time) 

th = new OptimizedTimeHandler(); 
th.setAlarmAt(Date.UTC(2011,9,19,0,0,0), operation); 
// will fire at 2011-09-18 00:24:00 (real time) 

如果你無法控制報警的實際安排,我不認爲有什麼辦法來壓縮時間。當您從數據庫中讀取警報時,您將不得不使用這些類來安排警報。

+0

這不起作用,因爲我需要在每天的某個特定時間,例如午夜做某些事情,但是我想驗證我的時間安排是否正確,而不是在午夜進行測試時。 – Travis

+0

@Travis,更新了答案。 –

+0

我明白了。我感謝您的幫助。就目前而言,我認爲答案是否定的,沒有辦法推動系統時鐘。感謝您提出的解決方案! – Travis