2010-05-26 1 views
2

저는 현재 30 초마다 약간의 작업을 수행하기 위해 타이머와 타이머 작업을 사용하고 있습니다.증분 타이머

제 문제는이 작업을 수행 할 때마다 타이머의 간격 시간을 늘리고 싶다는 것입니다.

예를 들어, 타이머가 작동하는 사이에 30 초 간격으로 시작하지만 간격에 10 초를 추가하여 다음에 타이머가 작동하기 전에 40 초가 걸릴 수 있도록합니다. 여기

내 앞의 코드입니다 :


public void StartScanning() { 

    scanTask = new TimerTask() { 
     public void run() { 
       handler.post(new Runnable() { 
         public void run() { 

          wifiManager.startScan(); 
          scanCount++;    
          if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){ 

           SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL; 
           t.schedule(scanTask, 0, SCAN_INTERVAL_TIME); 
          } 

         } 
       }); 
     }}; 
     Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME); 
     t.schedule(scanTask, 0, SCAN_INTERVAL_TIME); 

} 

리팩토링 코드


@Override 
public void StartScanning() { 

     t.schedule(new ScanTask(),SCAN_INTERVAL_TIME); 

} 

class ScanTask extends TimerTask{ 

    @Override 
    public void run() { 
     wifiManager.startScan(); 
     scanCount++; 

     if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL) 
     SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL; 

     t.schedule(new ScanTask(), SCAN_INTERVAL_TIME); 
    } 


} 

그것은 지금 작동하지만 새로운 ScanTask() 낭비마다 만들고있다? 여기

답변

4

내가 어떻게 할 것입니다 :

1) 실행의 끝에서)

2 일 반복 (아마도 finally 블록에서보다는 단일 실행을 위해 작업을 예약), 지연 시간이 더 긴 태스크의 새로운 단일 실행을 예약하십시오. 태스크의 새로운 인스턴스를 생성해야합니다. 그렇지 않으면 타이머가 불평합니다 (IllegalStateException). 이는 익명의 내부 클래스를 더 이상 사용할 수 없다는 것을 의미합니다.

+0

그래서 타이머가 작동 할 때마다 scanTask를 다시 생성해야합니까? –

+1

@Donal : 위의 코드에 따르면 무거운 초기화가없고 ScanTask 클래스에 데이터 멤버가 없습니다. 따라서 30 초마다 새 인스턴스를 생성하는 오버 헤드가 최소화되어야합니다 ... 가비지 수집은 수명이 짧은 객체를 매우 효율적으로 처리합니다. –