관리 메뉴

드럼치는 프로그래머

[안드로이드] 메시지 처리 Looper 본문

★─Programing/☆─Android

[안드로이드] 메시지 처리 Looper

드럼치는한동이 2011. 6. 1. 13:38

[First written by Steve Guo, please keep the mark if forwarding.]


Steve Guo 의 자료를 번역함과 동시에 개인적으로 스터디 한 내용을 추가하였습니다.


안드로이드 Thread는 자신과 결합된 메시지큐 가 없으므로 Looper 와 통신할 수 있는 핸들러를 가지고 있어야 한다.

 

class LooperThread extends Thread {

    public Handler mHandler;

   

    public void run() {

        Looper.prepare();

       

        mHandler = new Handler() {

            public void handleMessage(Message msg) {

                // process incoming messages here

            }

        };

       

        Looper.loop();

    }

}

 

프로세스가 자바 Application을 위해 생성되었다면 main thread는 top-level application오브젝트 ( activity, intent receiver,..)나 생성한 윈도우등을 관리하는 메시지큐를 처리하는 역할을하기때문에 main thread를 위해서는 Looper 개체가 필요없다.

 

하나의 Dalvik VM의 시작점은 아래와 같다.

    public static final void main(String[] args) {

        Looper.prepareMainLooper();

 

        ActivityThread thread = new ActivityThread();

        thread.attach(false);

 

        Looper.loop();

 

        if (Process.supportsProcesses()) {

            throw new RuntimeException("Main thread loop unexpectedly exited");

        }

 

        thread.detach();

    }

 

Handler.java 는 메시지 송신및 메시지와 쓰레드의 메시지큐와 연결된 Runnable 개체를 처리한다.

각 핸들러 인스턴스는 하나의 싱글 쓰레드와 연관되어 있다. 새로운 핸들러를 생성하면 그것을 생성한 쓰레드와 바운딩되어 그 쓰레드의 메시지큐로 오는 메시지와 Runnables을 전달하게 되고 메시지큐로부터 꺼내어 실행하게 된다.

 

핸들러의 메지시 API를 스케줄링 하는 부분은 2부분 (Send / Post) 으로 나눌 수 있다. send 버전은핸들러의 handleMessage() 에 의해 처리되는 데이터를 담고있는 메시지 개체를 큐에 넣는다. Post 버전은 메시지가수신될 때 메시지 큐에 의해 호출되는 Runnable 개체를 큐에 넣도록 해준다.

 

// Example 2:

class MyActivity extends Activity {

    Handler mHandler = new Handler();

   

    public void XXX() {

        // post a runnable object to run on main message queue

mHandler.post(new Runnable() {

            public void run() {

                // now it’s run on the thread corresponding to mHandler.

            }

        });

    }

}

 

아래로 부터 번역및 수정하였습니다.

출처: http://letsgoustc.spaces.live.com/blog/cns%2189AD27DFB5E249BA%21514.entry


Comments