반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

Understanding Threads



액티비티, 서비스, 브로드캐시트 리시버 같은 모든 안드로이드 어플리케이션 컴포넌트들은 main application thread 안에서 실행됩니다. 다른 말로 하면 main application thread 는 모든 user-interface와 관련된 task들을 수행합니다. 어플리케이션의 효율성을 증가시키기 위해서 오랫동안 수행되는 혹은 비동기로 수행되는 태스크들과 user와 interact를 하지 않는 태스크들은 백그라운드 쓰레드 수행을 하도록 합니다.



또한 운영체제는 메인 쓰레드가 message에 responsive 하기를 기대하고 있기 때문에 이 메인 쓰레드를 block 할 수 있는 operation은 별도의 쓰레드에서 실행 됩니다. 그래서 메인 쓰레드는 다른 쓰레드들을 컨트롤 하고 User Interface (UI) element들을 업데이트 합니다.


백그라운드 쓰레드로 프로세스 태스크를 옮기는 방법에는 아래의 두가지가 있습니다.


- Handler class 사용하기
- AsyncTask class 사용하기



우선 Handler class 를 사용해서 백그라운드 쓰레드를 사용해서 태스크를 실행하는 방법을 알아 보겠습니다.



백그라운드 프로세스 태스크를 위해 우리가 만든 thread를 implement 하고 그것과 동기화 하기 위해 Handler class 를 사용할 겁니다. 핸들러 클래스는 그것을 생성한 쓰레드와 연결 될 겁니다. 그래서 핸들러 클래스가 초기화 된 그 쓰레드에 코딩을 하실 수 있습니다. 핸들러 클래스와 communicate 할 수 있는 두가지 방법은 messages와 runnable object를 통해서 하는 것입니다. 그 핸들러 클래스에서 object 를 생성한 후 그 object는 현재 쓰레드의 MessageQueue와 연결된 메세지와 runnable object들 처리합니다. 이 태스크는 현재의 쓰레드에 의해 실행되어야 하며 그 실행되기 까지 MessageQueue에서 기다리게 됩니다.



메세지를 처리하기 위해 handleMessage() 메소드를 오버라이드 합니다. runnable object를 처리하기 위해서는 post() 메소드를 사용합니다. 이 쓰레드는 sendMessage(Message msg) 메소드나 sendEmptyMessage() 메소드를 통해서 메세지를 post 할 수 있습니다.



핸들러 클래스를 사용하는 개념을 이해하기 위해 쓰레드를 사용해서 1부터 10까지 숫자를 순차적으로 display 하는 어플리케이션을 만들겠습니다. 이 앱의 이름은 TreadApp 이라고 하겠습니다. 여기에는 순차적인 숫자들만 표시합니다. 그러니까 레이아웃에는 TextView 만 필요하겠죠. 아래 layout xml을 참조하세요.



activity_thread_app.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/seqnums"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="@dimen/text_size"
        android:textStyle="bold" />
</LinearLayout>


보시다시피 TextView 의 id는 seqnums 입니다. 자바 파일 안에서 이 id를 가지고 활용을 하게 될 겁니다. 폰트 사이즈는 dimension 리소스의 text_size를 사용해서 표시 됩니다. 쓰레드 핸들러를 정의해서 메세지를 보내고 받기 위해 아래와 같이 자바 코드를 만듭니다.


ThreadAppActivity.java



public class ThreadAppActivity extends Activity {
    static TextView seqNums;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_thread_app);
        seqNums=(TextView)findViewById(R.id.seqnums);
    }

    static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
        seqNums.setText(msg.obj.toString());       
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=1;i<=10;i++){
                    try {
                        Thread.sleep(1000);
                        Message msg = new Message();
                        msg.obj=String.valueOf(i);
                        handler.sendMessage(msg);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.start();
    }
}


onCreate() 메소드를 보시면 위에서 만들었던 layout xml을 contentView로 세팅을 하고 그 안에 있는 TextView에 대한 객체도 만들었습니다.
onStart() 메소드를 보시면 여기서 Thread 클래스를 사용하는걸 보실 수 있을 겁니다. 바로 runnable object와 함께 쓰레드를 사용하는 방법입니다.  run() 메소드에서 이 쓰레드를 실행시킵니다.



TextView에 1에서 10까지의 순차적인 번호를 표시하기 위해 run() 메소드에서 Message object를 생성하고 그 순차적인 번호를 add 합니다. 이 값들이 obj에 add 되고 나서 이 메세지를 Handler object를 통해서 send 하게 됩니다.



handler 라고 하는 Handler object가 생성돼 있죠? 이 안에 handleMessage()라고 하는 콜백 메소드안에서 이 obj 값이 TextView에 표시되도록 하는 코드가 있습니다.



이 앱을 실행시키면 1초 간격으로 1부터 10까지 화면에 표시할 겁니다. 




반응형