[Android] Thread Android 2012. 3. 6. 17:52
스레드는 한번에 여러개의 작업을 할 수 있다는 것을 프로그래머라면 다들 알 것이다. 프로세스 보다 작은 작업 스케쥴러임을..

생성 방법은 자바랑 별 차이가 없다.

class Thread extends Thread{
     public void run(){
     }
}
라는 클래스를 만들어 주고 그냥 돌리면 된다. 하나 차이가 있다면 setDaemon 을 이용하여 백그라운드에서 데몬처럼 이용하는지를 지정 할 수 있다.

다른 방법으로도 동일한게 있다. 바로 Runable을 확장해서 사용하는 방법이다.

class Thread implements Runable{
     public void run(){
     }
}

여기까지는 자바를 해 본 사람들이라면 다들 알 것이라 생각한다.

하지만 어떤 컴포넌트에 접근해서 쓰레드 안에서 접근하려면 오류가 난다. 이는 크로스 쓰레드 문제라는 것을 다들 알 것이다.

이를 해결하려면 자바에서 이용했던 핸들러 객체를 이용하면 된다.

Handler handler = new Handler(){
   public void handleMessage(Message msg){
   }
}

메세지를 구분하려면 msg.what 을 이용하면 된다.

위와 같이 구현 한 후 호출하는 부분에서 sendEmptyMessage와 같이 이용해서 접근 해야한다. C#에서 친다면 대리자를 이용한 Invoke 를 이용한 것이다.

또 다른 방법으로는 post를 이용하는 방법이다. 사용 방법은 아래와 같다. 단 핸들러 객체는 반드시 생성 해 둬야한다.

handler.post(new Runable(){
   public run(){
    }
});

핸들러로 메세지 전달하는 방법에도 안드로이드는 좀 신기 한 듯 하다.

Message 객체를 생성해서 obtain을 이용해서 넣을 수 있다.

Message msg = Message.obtain();
msg.what = value
msg.arg1 = value
처럼 한 후 sendMessage를 이용하여 핸들러에 전달한다. 여기서 arg1은 하나의 값, 하나를 더 보내자면 arg2를 해서 전달하면 된다.
다른 인자 값으로는 핸들러, what, arg1, arg2, obj 가 들어가는데 이들 형식은 핸들러를 제외하고 3개는 int 마지막 하나는 obj 타입이다.
그리고 recycle 메서드가 있는데 이놈은 다시 한번 메세지 풀에 다시 집어 넣는다. 하지만 이후 접근해서는 안된다.

또한 루퍼(Looper) 라는 것이 있다. 루퍼는 메세지를 전달 해 주는 역할을 한다.

prepare()를 이용하여 루퍼를 준비하고 loop()를 이용하여 실행한다. 이는 quit()가 실행 될 때 까지 작업을 한다.

루퍼를 구현하는 함수는 다음과 같다.

Thread getThread() - 현재 연결된 스레드 가져옴

static Looper getMainLooper() - 메인 스레드 루퍼 구현

static Looper myLooper() - 현재 스레드의 루퍼 구현

또한 스케쥴링에 의한 제어도 가능하다. 모두 어떤 프로세스를 실행 했을 때 어느정도 딜레이가 되거나 데이터가 제때 완료되어 나오지 않음을 경험 한 적이 있을 것이다.

안드로이드는 쓰레드 클래스를 이용 할 때와 Runable 이용하여 작업 시 각기 메세지를 보낼 절대 시간을 지정하거나 딜레이를 가지고 전달하는 방법이 있다.

쓰레드 클레스 경우 - sendMessageAtTime(Message,long)와 sendMessageDelayed(Message,long)

Runable 경우 - postAtTime(Runable, long)와 poatDelayed(Runable,long)

위와 같이 핸들러에 연결하여 이용하면 된다. 또한 핸들러를 직접 만들지 않고 컴포넌트 상에서도 접근하여 이용 할 수가 있다.

좀 더 효율 적으로 하기 위해 AsyncTask(1.5버전에서 제공) 하는데 솔직히 필자로 봣을 때는 (안드로이드 프로그래머가 아니라..) 그런 상황이 오면 이용을 할 만하겠다 싶긴하지만 필요성을 못 느끼고 있다..(고수님들이 보시면 설명 좀 해주시면 감사하겠습니다.)