2012-09-17 5 views
1

좋아, 그래서 핸들러에 대한 많은 자습서와 스레드를 읽었지만, 처리기에 대한 내 자신의 지식으로 더 발전한 것처럼 보입니다. 이것은 처음으로 처리기를 사용하여 저와 잘 어울리는 것입니다. 나는이 샘플 응용 프로그램을 특정 시간에 로그를 발생시키는 처리기에 있지만 시작 단추를 클릭 할 때 작동하지 않는 것 같습니다. 아래는 제 코드입니다.기본 방식으로 처리기 구현하기

public class Main extends Activity { 
    private long selectedTimeInMills; 
    private Handler handler; 
    private static final Calendar CALENDAR = Calendar.getInstance(); 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TimePicker timepicker = (TimePicker) findViewById(R.id.timePicker1); 
     final TextView timeText = (TextView) findViewById(R.id.time); 

     Button start = (Button) findViewById(R.id.button1); 
     handler = new Handler(); 
     String textTime = formatDate(CALENDAR.getTimeInMillis(), "hh:mm a"); 
     timeText.setText(textTime); 

     timepicker.setOnTimeChangedListener(new OnTimeChangedListener() { 

      public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
       CALENDAR.set(Calendar.HOUR_OF_DAY, hourOfDay); 
       CALENDAR.set(Calendar.MINUTE, minute); 
       selectedTimeInMills = CALENDAR.getTimeInMillis(); 
       String textTime = formatDate(CALENDAR.getTimeInMillis(), "hh:mm a"); 
       timeText.setText(textTime); 
      } 
     }); 

     start.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Runnable runnable = new Runnable() { 

        public void run() { 
         Log.d("HandlerCheck", "Handler Fired! @ ("+selectedTimeInMills+") "+formatDate(selectedTimeInMills, "hh:mm a")); 
        } 
       }; 
       boolean flag = handler.postAtTime(runnable, selectedTimeInMills); 

       Toast.makeText(Main.this, "Handler is Fired?:: "+flag, Toast.LENGTH_LONG).show(); 
      } 


     }); 

    } 
} 

참고 : 내 버튼을 클릭하고 그것이 true를 반환하지만 난 여전히 승리 현재 시간에서 내 timepicker 1 분을 설정 한 경우에도 여전히 DDMS에 로그를 표시하지 않습니다 handler.postAtTime()을 구현할 때 DDMS에서 로그 메시지를 발생시키지 마십시오

+0

logcat에서 오류/예외가 표시됩니까? – Squonk

+0

아무 것도 보이지 않는다. 그 시간이 지나면 실제로 아무 일도 일어나지 않는다. – lemoncodes

+0

OK, 그냥 생각했다. 12 시간과 24 시간 시계 사이의 시간이 일치하지 않아야합니다. 예를 들어 오후 3 시간 (12 시간)은 15 시간 (24 시간)입니다. 확인하기 위해'onTimeChanged (...)'에 넘겨지는 것을 로깅 해보십시오. – Squonk

답변

5

postAtTime 방법은 Handler입니다. statup에서 시간이 밀리 초 단위로 걸립니다. Calendar 시간 (당신이 통과하는 시간)이 아닙니다. 대신 시간을 계산하려면 SystemClock.uptimeMillis()을 사용해야합니다.

또는 postDelayed 함수를 사용하여 설정된 시간 (밀리 초) 후에 Runnable 객체를 호출 할 수 있습니다.

// Introduce a new private variable 
private long delayedTimeInMillis; 

// Update delayedTimeInMillis inside onTimeChanged method: 
delayedTimeInMillis = selectedTimeInMills - Calendar.getInstance().getTimeInMillis(); 

// replace handler.postAtTime(runnable, selectedTimeInMills); line with this: 
handler.postDelayed(runnable, delayedTimeInMillis) 
+0

ohhh 그래서 thats 무슨 upTimeMills, 나는 이것이 문제 였다는 생각이 들었지만, 어쩌면 이것도 adnroid와 java의 다른 모든 시간 utils와 같은 공장이라고 생각했습니다. 음 ... 이것을 시도해보십시오. – lemoncodes

+0

Btw @thira 메신저 postDelayed 및 postAtTime과 혼동. 사촌 내가 특정 시간에 지연하지 않는 특정 시간에 처리기를 발생시키지 wu't, 날 U 계몽 수 있습니까? – lemoncodes

+0

@lemoncodes : Thira가 제안한'delayedTimeInMillis' 접근법을 사용하면 효과가 있습니다. 나는'postAtTime'이 부팅 후 시간을 사용한다는 것을 깨닫지 못했습니다. – Squonk

관련 문제