Programming/Android

[Android]핸들러와 루퍼

MB Brad KWON 2013. 5. 19. 11:24

 안드로이드 정책 상으로 UI 조작 등은 UI스레드(메인 스레드:자바)만 할 수 있도록 막아놓았다. 이는 여러 스레드들이 동시에 UI에 접근하여 초래하는 혼란을 방지하기 위함이다. 그래서 개발자가 임의로 만든 스레드로 UI를 조작하는 상황이 발생하게 되면 이를 UI스레드에게 알려주어야 한다. 이 때, 핸들러와 루퍼를 이용하면 된다.



1. 핸들러

 핸들러는 스레드로 부터 메시지를 받아서 처리하는 부분이다. 핸들러 내부적으로 메시지 큐를 가지고 있어서 다른 스레드로부터 온 메시지들을 메시지 큐에서 하나씩 꺼내면서 처리하게 된다.


tHandler = new Handler(){


@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

viewText(msg.arg1 + " System Time ");

}

};


 위의 코드는 메시지 큐의 메시지를 처리하는 handleMessage 메소드를 오버라이딩하여 인자들을 TextView에 출력하는 예제이다. 그럼 메시지 큐에 메시지를 넣어줘야하는데 이는 루퍼를 이용하면 된다.


그리고 Activity에서 onDestroy()를 호출할 때, 루퍼를 종료시키는 것을 까먹지 말자.


@Override

protected void onDestroy() {

// TODO Auto-generated method stub


if(tHandler != null)

tHandler.getLooper().quit();


tThread.setRun(false);


super.onDestroy();

}




2. 루퍼

 루퍼는 스레드에서 처리한 내용을 메시지 큐에 삽입하여 핸들러에서 처리할 수 있도록 해준다. N개의 스레드가 메시지를 보내면 N개의 루퍼가 필요하다.



public class TimeThread extends Thread{


boolean isRun;



public void setRun(boolean isRun){

this.isRun = isRun;

}


public void run() {

// TODO Auto-generated method stub

this.isRun = true;


Looper.prepare();


while(isRun){

toActivity = tHandler.obtainMessage();


toActivity.arg1System.currentTimeMillis();


tHandler.sendMessage(toActivity);


try {

TimeThread.sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


Looper.loop();

}


}



 위의 스레드는 100 밀리초마다 시스템 시간을 인자로 넘겨주는 예제이다. Looper.prepare()와 Looper.loop() 사이에 행위와 핸들러로 메시지를 보내주는 내용을 정의하면된다.