2011-09-18 3 views
4

잠시 동안 검색했지만 동일한 질문을 찾을 수 없습니다.안드로이드에서 증가하는 시간의 흐름을 시뮬레이션 할 수 있습니까?

하루에 많은 알람을 예약해야하는 응용 프로그램을 작성하고 하루 종일 다른 작업을 수행해야합니다. 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

관련 문제