2011-07-18 5 views
2

특정 시간에 작업을 시작하고 싶습니다.postDelayed를 사용하여 특정 시간에 작업 실행

s = DateFormat.format("hh:mm:ss aaa", d.getTime()); 
cTime = s.toString(); // current Time 
ch = Integer.parseInt(cTime.substring(0,2)); // current hour 
cm = Integer.parseInt(cTime.substring(3,5)); // current minute 
cs = Integer.parseInt(cTime.substring(6,8)); // current second 
if (cTime.substring(9,11).equalsIgnoreCase("pm") && (ch<12)) ch = ch+12; 
myDelay=(desiredHour-ch)*3600+(desiredMinute-cm)*60 - cs; 
if (myDelay<0) myDelay = 0; 

desiredHour 다음과 같이

mHandler = new Handler(); 
mHandler.postDelayed(mLaunchTask, myDelay*1000); 

myDelay가 계산됩니다 : 내 코드에서

private Runnable mLaunchTask = new Runnable() { 
     public void run() { 

      try { 
       MY TASK 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
}; 

을 다음과 같이 내가 mLunchTask을 사용하여 다음과 같이 그 동안 나는 runnablepostDelayed 방법을 사용 및 desiredMinute은 사용자가 설정합니다. 예상치는 MY TASKdesiredHourdesiredMinute에서 시작하여 0 초입니다. 은 그러나 "내 작업은 무작위처럼 보이는 몇 초 지연으로 시작합니다. 위의 코드를 기반으로

, 그것은 정확한 원하는 시간에 시작하지 않는 어떤 이유가?

감사

을 모든
+0

아, mLunchTask : 내가 가장 좋아하는 것 : –

답변

4

첫째, 당신의 지연 계산은 정확하지만 "오후"검출은 다른 언어와 함께 작동하지 않습니다 지연 얻기 위해 달력을 사용하는 것이 훨씬 낫다 :.

Calendar calendar = Calendar.getInstance(); 
long currentTimestamp = calendar.getTimeInMillis(); 
calendar.set(Calendar.HOUR_OF_DAY, desiredHour); 
calendar.set(Calendar.MINUTE, desiredMinute); 
calendar.set(Calendar.SECOND, 0); 
long diffTimestamp = calendar.getTimeInMillis() - currentTimestamp; 
long myDelay = (diffTimestamp < 0 ? 0 : diffTimestamp); 

지금 당신은이를 밀리 초 단위로 지연 될 수있다. 핸들러를 시작하십시오 :

내 테스트에서 다음 runnable은 지연없이 원하는 시간에 기록됩니다.

private Runnable mLaunchTask = new Runnable() { 
    public void run() { 
     Calendar calendar = Calendar.getInstance(); 
     Log.d("test", "started at " 
      + calendar.get(Calendar.HOUR_OF_DAY) + " " 
      + calendar.get(Calendar.MINUTE) + " " 
      + calendar.get(Calendar.SECOND) 
     ); 
    } 
}; 

시작한 작업을로드하는 데 몇 초가 걸릴 수 있습니다.

AlarmManager을 대신 사용할 수 있습니까?

+0

답변 해 주셔서 감사합니다. 내 임무는 무거운 임무가 아니며 즉시 시작됩니다. 그러나 AlarmManager를 살펴 보려는 제안은 좋은 제안이며이를 사용할 수 있어야합니다. – TJ1

0

내 경험과 설명서를 읽은 postDelayed는 실시간이 아닌 가동 시간을 기반으로합니다. 전화기가 깊은 잠에 들어갈 경우 가동 시간이 증가하지 않고 실시간으로 전달 될 수 있습니다. 즉, 작업이 원하는 것보다 늦게 시작됩니다.

처리기는 실제로는 향후 활동을 예약하지 않고 활성 활동에서 GUI를 업데이트하기 위해 설계된 것으로 보입니다. scessor가 말했듯이, AlarmManager가 아마도 최선의 방법 일 것입니다.

0

나리바의 답변이 완전히 잘못되었습니다.

here 으로 볼 수있는 문서에 따르면이 클래스는 향후에 작업을 실행하는 데 특히 사용됨을 알 수 있습니다.

"는 처리기에 대한 두 가지 용도가있다 : (1) 예약하는 메시지보다 Runnable 미래 어떤 점으로 실행하려면, (2) 다른 스레드에 대해 수행 할 조치를 대기열 할

시스템이 절전 모드로 들어갈 때 응용 프로그램의 동작에 대한 참조가 없으므로이 문제는 추가 정보를 게시하기 전에 테스트해야합니다.

+0

내 대답은 정확합니다; 구글 문서는 우리가 우리의 글을 쓸 당시에 정말 좋지 않았다. 그들은 어떤 시점에서 uptimeMillis의 정의와 연결하여이를 향상 시켰습니다. – Naliba