티스토리 뷰

  이전에 Thread에 대해서 알아보았습니다. 이번엔 조금 더 들어가 Thread에서 Handler 사용을 알아보겠습니다. Thread에 대한 기초가 필요하시면 다음의 게시물을 보시고 오시면 됩니다.


[안드로이드] Thread 예제


Handler 라는 것은?

  간단하게 이야기해보면 Handler는 Thread의 비서라고 생각하시면 편합니다. 비서는 더 높은 위치에 있는 사람의 일을 돕는 역활을 합니다. Handler도 마찬가지 입니다. Thread라는 사장님의 일을 도와주는 역활을 합니다!! 위의 이전 게시물 예제에서 Thread가 돌고있다는 것을 Log를 이용해 확인을 하였습니다. 이제 이 Log로 돌고있다는 것을 알려주는 메시지를 어플내에서 TextView에 출력하고자 합니다. 우선 가장 먼져 드는 생각인 새로운 Thread안에서 TextView에 메시지를 띄워보겠습니다.


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
public class MainActivity extends AppCompatActivity {
    Button button;
    Runnable count;
    TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button = (Button) findViewById(R.id.button);
        text = (TextView) findViewById(R.id.textView);
        
        count = new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<1000000000;i++){
                    if(i%100000000==0){
                        text.setText(text.getText().toString()+"\n"+"지금 까지 : "+i+"번");
                    }
                }
            }
        };
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread countThread = new Thread(count);
                countThread.start();
            }
        });
 
    }
}
cs


  Thread 예제에서 TextView만 추가시키고 Log대신 TextView에 출력되도록 하였습니다.



  실행이 한번되고 종료되는 것을 볼 수 있습니다. Main Thread는 새로만들어진 Thread가 자신의 영역을 건드리는 것을 원하지 않습니다. 따라서 새로운 Thread는 Handler라는 비서에게 "이렇게 해주실래요?" 라고 요청을 해주어 Main Thread가 담당하던 구역에서의 일을 처리하여야 합니다. 그럼이제 Handler를 만들고 TextView에 등록될 내용을 요청해 보겠습니다!


Thread Handler

1
Handler handler;
cs


  Handler를 선언하여 주었습니다. 여기서 꼭 알고아셔야 하는점이 저 비서(Handler)가 누구의 비선인가 하는건데요. 바로 Handler를 new를 이용해 object를 만들어준 공간의 사람이 Handler의 주인이 됩니다. 예제에서는 onCreat 함수 안에서 만들어 주었으므로 Main Thread가 Handler의 주인이 될 것 입니다.


1
handler = new Handler();
cs


  이제 비서(Handler)의 주인이 정해졌습니다. 이제 사용을 해보겠습니다. 사용을 위해서 post라는것을 쓰셔야 하는데요 post는 아래의 보이듯 우편이라는 뜻을 가지고 있습니다. 따라서 post를 사용해서 Handler(비서)에게 이것을 요청해 달라~ 하고 전달하는 느낌으로 이해하시면 됩니다.


  이제 handler의 post를 (handler.post) 사용해서 원하는 내용을 보내는 것까지 알아보았습니다. 여기서 딱 하나만 더 알고 가셔야합니다..! 바로 post안에 주어야할 인자입니다. Thread에서 인자로 Runnable 형태를 주었던 것처럼 post도 Runnable 형태로 되어있는 인자를 주어야합니다. 그럼 Runnable을 선언해서 TextView를 출력해주는 코드를 run Method에 넣어보겠습니다.


1
2
3
4
Runnable count_message; //Runnable 형태 선언
int count2 = 0// 위의 예제에서는 if안의 i를 그대로 썻지만 이제 i를 쓰지 못하기 때문에
                   int count2라는 것을 따로 만들어 주었습니다.
                   (if에 걸리면 count2 = i를 통해 숫자를 똑같이 하였습니다.)
cs

1
2
3
4
5
6
count_message = new Runnable() {
            @Override
            public void run() {
                text.setText(text.getText().toString()+"\n"+"지금 까지 : "+count2+"번");
            }
        };
cs


  Runnable 형태의 count_message를 정의해주고 run Method에 TextView에 출력해야할 내용을 입력하였습니다. 이제 post를 이용해서 새로운 Thread에서 Handler에게 요청해 보겠습니다.


1
handler.post(count_message);
cs


  잘 되나 실행을 해보겠습니다.



  잘나오는 것을 확인할 수 있습니다!! 마지막에 보니 TextView에 스크롤이 없어 내려가지 않는것을 보실 수 있는데요 다음에 스크롤 처리를 올려야겠네요ㅎㅎ 수고하셨습니다. 최종 코드는 다음과 같습니다.

(스크롤 처리 게시물 :: [안드로이드] ScrollView 간단 예제)



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
39
40
41
42
43
44
45
46
public class MainActivity extends AppCompatActivity {
    Button button;
    Runnable count;
    Runnable count_message;
    TextView text;
    Handler handler;
 
    int count2 = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        button = (Button) findViewById(R.id.button);
        text = (TextView) findViewById(R.id.textView);
        handler = new Handler();
        count_message = new Runnable() {
            @Override
            public void run() {
                text.setText(text.getText().toString()+"\n"+"지금 까지 : "+count2+"번");
            }
        };
 
        count = new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<1000000000;i++){
                    if(i%100000000==0){
                        count2 = i;
                        handler.post(count_message);
                    }
                }
                count2 =  0;
            }
        };
 
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread countThread = new Thread(count);
                countThread.start();
            }
        });
 
    }
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday