是否可以模拟Android中增加的时间流逝率?

时间:2011-09-18 13:03:05

标签: android

我搜索了一会儿,但找不到同样的问题。

我正在编写一个应用程序,我需要每天安排很多闹钟,然后在一天中做不同的事情,我希望能够测试,比如24小时24小时,或者其他什么那些台词。

是否可以在模拟器或设备上模拟更快的时间流逝?

如果是的话,这对我来说非常好,能够在不失去开发时间的情况下测试这些东西。事实上,我正在以一种我认为可行的方式编写它们,进行现场测试,然后自己运行程序以验证行为是否正确,但是它大大减慢了我的开发时间,不得不等待一天或两者之间看到一个不良行为,然后尝试修复它并重新测试它。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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;
    }
}

<强>更新

您可以将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)

如果你无法控制警报的实际调度,我认为没有办法压缩时间。当您从数据库中读取警报时,您必须使用这些类来安排警报。

相关问题