필자는 버튼을 누르면 초가 지나는 timer를 구현하고 싶다.(아래 코드는 버튼을 클릭했을 때의 이벤트 내에 있음)

그러기 위해서는 timer 스레드를 만들어 줄 필요가 있는데 코드는 다음과 같다.

final TextView Display_ = (TextView) findViewById(R.id.Display_); final Timer ssmmss = new Timer(); TimerTask outputtime = new TimerTask() { @Override public void run() { msecond ++; if(msecond > 5) { ssmmss.cancel(); }else Display_.setText(""+msecond); } } }; ssmmss.schedule(outputtime, 0,1000);

schedule 에 들어있는 것들 (timeTask 스레드, 지연시간, 주기) 이다.

이렇게 하면 필자는 바로 시간초가 나올 줄 알았지만 그렇게 간단한 것이 아니였다.

Only the original thread that created a view hierarchy can touch its views.

이런 에러가 발생을 했는데 원인은 메인 스레드 이외에 생성한 스레드로 UI를 변경할 때 나는 에러라고 한다.

그렇기에 UI를 변경하는 구문들을 빼야하는데 그러면 저 타이머 스레드를 생성한 의미가 없어진다.

고로 핸들러를 이용하여 저기 타이머 스레드가 작동할 때마다 핸들러의 내용을 불러오게 만들면 된다.

final TextView Display_ = (TextView) findViewById(R.id.Display_); final Timer ssmmss = new Timer(); final Handler timerhandler = new Handler(){ public void handleMessage(Message msg){ msecond ++; if(msecond > 5) { ssmmss.cancel(); }else Display_.setText(""+msecond); } }; TimerTask outputtime = new TimerTask() { @Override public void run() { Message msg = timerhandler.obtainMessage(); timerhandler.sendMessage(msg); } }; ssmmss.schedule(outputtime, 0,1000);

Message msg = timerhandler.obtainMessage();

timerhandler.sendMessage(msg);

이렇게 핸들러를 호출 하여주면 구동이 가능해진다.

+ Recent posts