안드로이드 개발 질문/답변
(글 수 45,052)
Thread에서 또다시 발목을 잡혔네요.
위와 같은 함수를 하나 만들어서 Handler에 호출을 하고 있습니다. Thread에서는 run에 while문을 실행함으로써 반복적인 수행을 하는 것을로 알고 있는데요.
바로 위의 소스는 핸들러에 넣은 부분입니다. sendMessageDelayed를 하면 10milli sec다음에 메세지가 전송되서 1초마다 해당 메세지를들러에서 받아 실행할거라고 생각을 했습니다만, 잘 되지가 않더라구요.
먼저 제가 테스트하는 프로그램은 1초씩 증가되어 텍스트뷰에 보여지는 것을 하려고 합니다. 그런데 그게 맘처럼 잘 되지가 않네요.
Thread부분의 소스는 아래와 같습니다.
public void Timer(){
Thread availTimer=new Thread(){
public void run(){
while(CONDITION){
mHandler.sendMessageDelayed(Message.obtain(mHandler, TIMER_SET), 10);
//mHandler.sendMessage(Message.obtain(mHandler, TEST));
}
}
};
availTimer.start();
}
case TIMER_SET:
TOTAL_TIME++;
TextView availableTime=(TextView)findViewById(TV_ID);
availableTime.setText("AVALIABLE TIME: "+Long.toString(TOTAL_TIME/60)+"."+Long.toString(TOTAL_TIME%60));
if(TOTAL_TIME>=MAX_AVAILABLE_TIME){
CONDITION=false;
}
바로 위의 소스는 핸들러에 넣은 부분입니다. sendMessageDelayed를 하면 10milli sec다음에 메세지가 전송되서 1초마다 해당 메세지를들러에서 받아 실행할거라고 생각을 했습니다만, 잘 되지가 않더라구요.
질문입니다.
위의 예제에서 sendMsgDelayed 를 사용하게 되면, while 문에 의해서 계속해서 불리는 건가요? senMsgDelayed의 처리가 되는 것과 상관없이요. 아니면 1초를 기달렸다가 while 문이 다시 처음을 수행하게 되는 건가요? (질문이 좀..)
다시 예를 들면, 함수는 간단히 이름을 쓰겠습니다.
while(true){
sendMsgDelayed(1초);
setText("1");
}
이렇게 된다고 가정했을 경우에, 1초후에 "1" 이 세팅되나요? 아니면 sendMsgDelayed와 상관없이 "1"이 세팅이 되는건가요?
어렵네요... ㅠ ㅠ
2009.08.26 16:30:18
위에서 테스트하고 싶었던 것은 해결을 했네요. 그런데 해결하는 중에 이해가 가질 않은 것이 있어서 질문을 다시 드리겠습니다.
while(true){
sleep(1)
sendMsg()
}
sleep을 이용하니깐 위에선 1초의 텀으로 값이 찍혀서 나오더라구요.
sleep이라는 것이 도대체 어떤 걸 sleep 하는건가요?? 현재 Thread를 sleep하지는 않는 것 같아서 .. 질문을 드립니다.
2009.08.26 16:57:47
개인적인 어설픈 생각으로는
sleep 을 사용하여 Thread의 동작 우선권을 다른쪽으로 넘기는 역할을 합니다.
위와 같은 경우 sleep 없이 사용하면, (sendMessageDelayed 가 있다고 Thread가 쉬는것은 아닌 것으로 알고 있습니다)
쓰레드 내부에서 0.01 초 마다 메시지를 보내는 작업을 끊임없이 수행하기만 하고,
실제 그것을 처리할 여유를 안줘서 그럴것 같습니다. (sendMsg 로 처리하고 싶어하는 작업)
일정시간 마다 특정일을 수행하고자 한다면, 위험성이 상대적으로 큰 쓰레드 보다는
AlarmManager 를 사용해보세요.
저도 Thread를 잘못 사용해서 제 어플은 잘 동작하지만, 다른 어플이 동작시에 다른 어플 동작에 영향을 미치기도 했습니다
(제때 쓰레드가 안끊겨서...)
최악의 경우 전화가 와도 전화 못받는 일까지.^^;;