2011-09-18 43 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