2013-06-06 2 views
4

자주 작동하는 시간을 자주 업데이트하는 TextView가 있지만 문제는 다른 조건에 대한 일정 시간을 변경하려고하지만 일정 시간을 변경할 수 없다는 것입니다. 초기에 설정된 시간이 계속됩니다.변경 타이머 일정 scheduleAtFixedRate

private Long mPeriod = Long.parseLong("8000"); 

public void startTimer() { 
    Logger.i("startTimer", "startTimer"); 

    stopTimer(); 
    mTimer = new Timer(); 
    mTimerTask = new TimerTask() { 
     @Override 
     public void run() { 
      // postInvalidate(); 
      Logger.i("timer", "timer"); 
      Thread th = new Thread(new Runnable() { 

       @Override 
       public void run() { 
        Logger.i("thread", "thread"); 

        Long ll = System.currentTimeMillis(); 

        mRelativeTime = DateUtils.getRelativeTimeSpanString(
          Long.parseLong(mText + ""), ll, 0); 

        Long diff = ll - Long.parseLong(mText + ""); 
        // long diffSeconds = diff/1000 % 60; 
        long diffMinutes = diff/(60 * 1000) % 60; 
        long diffHours = diff/(60 * 60 * 1000) % 60; 

        Logger.d("diffMinutes", diffMinutes + ""); 
        Logger.d("diffHours", diffHours + ""); 
        if (diffMinutes == 0 && diffHours == 0) { 
         Logger.i("5000", "5000"); 
         mPeriod = Long.parseLong("5000"); 
        } else if (diffMinutes < 60 && diffMinutes != 0 
          && diffHours == 0) { 
         Logger.i("30000", "30000"); 
         mPeriod = Long.parseLong("30000"); 
        } else if (diffHours > 0) { 
         Logger.i("600000", "600000"); 
         mPeriod = Long.parseLong("600000"); 
        } 
        **// This line is not working... 
        mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod);** 
        // Change text 
        handler.sendEmptyMessage(0); 

       } 
      }); 
      th.run(); 
     } 
    }; 
    mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod); 
} 

public void stopTimer() { 

    if (mTimer != null) { 
     mTimer.cancel(); 
     mTimer = null; 
    } 

} 

답변

2

나는 내 문제를 해결했습니다. 이전 지연을 확인하십시오. 아래 해결 방법이 있습니다.

private Long mPeriod = Long.parseLong("8000"); 

public void startTimer() { 

Logger.i("startTimer", "startTimer"); 

stopTimer(); 
mTimer = new Timer(); 
mTimerTask = new TimerTask() { 
    @Override 
    public void run() { 
     // postInvalidate(); 
     Logger.i("timer", "timer"); 
     Thread th = new Thread(new Runnable() { 

      @Override 
      public void run() { 
       Logger.i("thread", "thread"); 

       Long ll = System.currentTimeMillis(); 

       mRelativeTime = DateUtils.getRelativeTimeSpanString(
         Long.parseLong(mText + ""), ll, 0); 

       Long diff = ll - Long.parseLong(mText + ""); 
       // long diffSeconds = diff/1000 % 60; 
       long diffMinutes = diff/(60 * 1000) % 60; 
       long diffHours = diff/(60 * 60 * 1000) % 60; 

       Logger.d("diffMinutes", diffMinutes + ""); 
       Logger.d("diffHours", diffHours + ""); 
       if (diffMinutes == 0 && diffHours == 0 && mTimerTask != 5000) { 
        Logger.i("5000", "5000"); 
        mPeriod = Long.parseLong("5000"); 
        startTimer(); 
       } else if (diffMinutes < 60 && diffMinutes != 0 
         && diffHours == 0 && mTimerTask != 30000) { 
        Logger.i("30000", "30000"); 
        mPeriod = Long.parseLong("30000"); 
        startTimer(); 
       } else if (diffHours > 0 && mTimerTask != 600000) { 
        Logger.i("600000", "600000"); 
        mPeriod = Long.parseLong("600000"); 
        startTimer(); 
       } 

       // Change text 
       handler.sendEmptyMessage(0); 

      } 
     }); 
     th.run(); 
    } 
}; 
mTimer.scheduleAtFixedRate(mTimerTask, 0, mPeriod); 
} 

public void stopTimer() { 
if (mTimer != null) { 
    mTimer.cancel(); 
    mTimer = null; 
} 

} 
3

TimerTask에서 확장하는 자체 CustomTimerTask 클래스를 만들어야합니다. 이 후 mCustomTimerTask (CustomTimerTask의 객체)를 사용하여 시간을 재조정 할 수 있습니다. Here는 아마도 복제 된 대답 일 수 있습니다.

+0

그 중복 질문. 그리고 같은 녀석이 대답했다 : P –

+0

그것은 중복 질문이 아니다. TimerTask 내에서 TimerTask를 재 스케줄 한 후 다시 시작하기 때문에 재귀처럼 취급하고 있던 TimerTask 내에서 타이머를 다시 예약하려고합니다. –