안드로이드/이론

안드로이드 핸들러(Handler),스레드(Thread) 사용하기

원원 2017. 8. 25. 18:48



안녕하세요. 핸들러(Handler)에 대해 알아보겠습니다.

핸들러란 다른 객체들이 보낸 데이터를 받고 이 데이터를 처리하는 객체입니다. 

이 전 글에서 스레드를 적었는데, 스레드에서 UI를 제어하려고 할 때 이 핸들러가 사용됩니다.

1. 스레드객체가 핸들러객체한테 정보전송

2. 핸들러객체가 UI변경

이런식으로 사용하게 됩니다.




핸들러 사용 과정



위의 그림은 핸들러를 사용하는 과정인데요. 스레드가 UI를 제어하기 위해서는 핸들러에게 정보를 줘야합니다.

그러기 위해서는 스레드가 먼저 핸들러 정보를 얻어야하는데요 그게 2.obtainMessage함수 입니다. 호출을 하면 Message객체를 얻을 수 있습니다.

Message객체를 얻었으니 여기에 데이터를 넣고 3.sendMessage함수를 사용하여 메세지 큐에 데이터를 보냅니다. 그럼 메시지 큐에 들어간 데이터 순서대로 1.handleMessage함수를 통하여 데이터를 제어합니다.


실제로 위의 과정을 코드로 표현해보겠습니다.



핸들러 사용 과정 (코드)


2.obtainMessage

1
Message msg = han.obtainMessage();
cs

Message객체를 만드는데 이 클래스에있는 arg1,arg2변수를 통하여 데이터를 보낼 수 있습니다.

(han은 핸들러 클래스)

Message클래스에 대한 정보


3.sendMessage

1
2
msg.arg1 = count;
han.sendMessage(msg);
cs

Message객체에있는 arg1클래스에 count값을 넣고 메세지 큐로 데이터를 보내는 모습입니다.


1handleMessage

1
2
3
4
public void handleMessage(Message msg) {
                super.handleMessage(msg);
                tv.setText(msg.arg1+"");
}
cs

핸들러에서 받은 count값을 텍스트뷰에 표시하는 모습입니다.

(tv는 텍스트뷰)




실제 핸들러 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends AppCompatActivity  {
    TextView tv;
    Handler han;
    int count;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textView);
 
        han = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                tv.setText(msg.arg1+"");
            }
        };
 
        Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
                    count =0;
                    while (true) {
                        Message msg = han.obtainMessage();
                        count++;
                        msg.arg1 = count;
                        han.sendMessage(msg);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
            }
        });
        th.start();
    }
}
cs

전체 코드입니다. 2,3,1번 과정을 한번 보고 전체코드를 보면 흐름을 알 수 있습니다..


위의 코드 실행 결과입니다.