2012-03-09 6 views
1

스케줄러를 사용하여 루프가 너무 오래 걸리지 않도록 스케줄러를 실행하고 루프를 종료하면 루프를 종료합니다.ScheduledExecutorService를 사용하여 Android에서 예약 된 작업 예약 취소

이 매우 정직 :

public void startSchedulerForTimeout() { 

    Log.i("x", "SCHEDULING TIMEOUT "); 
    timeoutForLoopReached = false; 
    scheduler.schedule(new Runnable() { 
    public void run() { 
     timeoutForLoopReached = true; 
     Log.i("x", "SET TIMEOUT FLAG "); 
     } 
    }, 10, TimeUnit.SECONDS); 
} 

그래서 내 코드에 난 그냥 쓰기 : 내가 필요 다시 루프를 실행하면 예약 된 작업이 실행되지 않는

startSchedulerForUSBMessageTimeout(); 
while (!done && !timeoutForLoopReached) { 
    ...do the loop stuff 
} 

을 확인하려면 새로운 타이머가 두 번째 시간 사이에 첫 번째 루프가 끝난 후에 발사되는 이전 루프 대신 새로운 루프의 시작에서 다시 시작되도록 쓸모없는 작업의 스케줄을 취소하십시오 (타임 아웃 전에 루프를 종료 한 경우). 루프가 실행 됨)

이 예약 된 작업 혼합을 피하기 위해 해고되지 않은 예약 된 작업의 예약을 취소 할 수 있습니까?

감사합니다.

답변

5

사용 ScheduledFuture :

ScheduledExecutorService scheduledTaskExecutor = Executors.newScheduledThreadPool(1); 
Runnable longRunningTask = new Runnable(); 

// schedule long running task in 2 minutes: 
ScheduledFuture scheduleFuture = scheduledTaskExecutor.schedule(longRunningTask, 2, TimeUnit.MINUTES); 

... ... 
// At some point in the future, if you want to cancel scheduled task: 
scheduleFuture.cancel(true); 
... ... 
+0

슈퍼 - 대단히 감사합니다. 그런데이 모든 것이 한 가지 방법에 있고 1 분 후에 완전한 방법이 끝나면. 메서드가 완료된 후에도 일정 작업이 여전히 존재합니까? 아니면 자동으로 종료됩니까? 또한, 같은 scheduleFuture를 두 번 이상 취소하면 문제가 발생합니까? 또는 이미 취소 (또는 실행) 된 경우 추적해야합니까? – user387184

+0

그건 그렇고, 방금 애플 리케이션을 종료하고 디버거가 계속 인쇄 - 그리고 그것은 디버거 출력의 백 로그처럼 보이지 않습니다. 그래서 앱이 종료 될 때까지 "뒤로"를 눌러도 앱이 계속 실행됩니까? 이상하지 않니? – user387184

+0

@ user387184 1. 예약 된 작업이 자동으로 종료되지 않습니다. ScheduledExecutorService.shutdownNow()를 사용하여 실행중인 모든 작업과 대기중인 작업을 모두 종료합니다. 2. cancel() 메소드 API를 체크 아웃하십시오. _Attempts 3.이 타스크의 실행을 취소하십시오. 작업이 이미 완료되었거나 이미 취소되었거나 다른 이유로 취소 할 수없는 경우이 시도는 실패합니다 ._ 3. API를 확인하면 ScheduledFuture 클래스의 다른 유용한 API 인 getDelay(), isCancelled()) 등 – yorkw

1

schedule의 모든 재정의는 이고 cancel 메서드를 갖는 ScheduledFuture을 반환합니다.

+0

당신이 작은 코드를 제공하시기 바랍니다 수 있을까? – user387184