1. 핸들러(Handler)란?

-> 다른 객체들이 보낸 데이터를 받고 이 데이터를 처리 하는 객체이다.

 

스레드에서 UI를 제어하려고 할 때는 이 핸들러(Handler)가 사용된다!

-사용 흐름-

(1) [스레드객체]가 [핸들러객체]한테 정보 전송 

(2) [핸들러객체]가 UI변경 해준다!!!!!

 

 

 

 


 

 

 

2. 핸들러 사용 과정 설명

- 스레드가 UI를 제어하기 위해서는 핸들러에게 정보를 주어야 한다.

- 그러기 위해서는 스레드가 먼저 핸들러 정보를 얻어야한다. (obtainMessage메소드를 이용해서!!. 호출을 하면 Message객체를 얻을 수 있다.)

- Message객체를 얻었으니 여기에 데이터를 넣고 sendMessage메소드를 사용하여 메세지 큐에 데이터를 보냅니다.

그럼 메시지 큐에 들어간 데이터 순서대로 handleMessage메소드를 통하여 데이터를 제어한다.

 

 

 


 

 

 

3. 핸들러 사용 과정  설명 + 그림 (그림이랑 설명 같이 보기)

1.

 

 

 

1-2.일딴 그림만 보고, 2번 보면 됨.

 

2."메시지 큐"에서 처리 할 수 없는

  "Message객체 하나"를 참조 해야한다.

 

3.

 

 

4.

 

 

5.

*handleMessage() : 전달된 메시지를 처리하는 메소드

 

 

 

 


 

 

 

 

4. 핸들러 사용 과정 코드

1.obtainMessageㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

설명->

Message객체를 만들고 이 클래스에있는 arg1, arg2변수통하여 데이터를 보낼 수 있다!!

(참고 - hand은 핸들러 클래스)

(Message객체 형식으로 보낼 데이터 만들고 보내는 거임)  

 

 

 

2.sendMessageㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

<기본틀>

<보내는 방법>

-설명-

Message객체에있는 arg1매개변수에 count값을 넣고 메세지 큐로 데이터를 보내는 과정입니다.

 

 

 

3.handleMessageㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

-설명-

핸들러에서 받은 count을 텍스트뷰에 표시하는 과정입니다!

 

 

 

 


 

 

5. 핸들러 전체 코드

(순서대로 그냥 봐)

-방법 1-

public class MainActivity extends AppCompatActivity  {

    TextView tv;
    Handler hand; //핸들러
    int count;    //숫자

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textv);
 
        hand = new Handler(){                                     // 0.스레드에서 UI를 제어할려면 Handler 만들어! (생성)
            @Override
            public void handleMessage(Message msg) {        // 3.메시지 값(msg) 받음!!!
                super.handleMessage(msg);
                tv.setText(msg.arg1+"");                    // 4.메시지 값(msg) 사용
            }
        };
 
        Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
                    count =0;
                    while (true) {
                        Message msg = hand.obtainMessage();   // 1.메시지 객체 하나 참조 (msg사용 할려면 해줘야함)
                        count++;
                        msg.arg1 = count;
                        hand.sendMessage(msg);                // 2.★핸들러에 메시지 전송 
                        
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        
                    }
            }
        });
        th.start();

    }
}

 

(순서대로 그냥 봐)

-방법 2-

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;


public class Two extends AppCompatActivity {

    TextView num1;
    int count;                         // 숫자
    CountHandler hand;       // 핸들러 (만든 class)

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.two);

        num1 =findViewById(R.id.num1);

        hand = new CountHandler();                      // 0.스레드에서 UI를 제어할려면 Handler 생성!

       Thread th = new Thread(new Runnable() {
            @Override
            public void run() {
                count =0;
                while (true) {
                    Message msg = hand.obtainMessage();   // 1.메시지 객체 하나 참조 (msg사용 할려면 해줘야함)
                    count++;
                    msg.arg1 = count;
                    hand.sendMessage(msg);                // 2.★핸들러에 메시지 전송 
                    
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                }
            }
        });
        th.start();

    }

    public class CountHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {      // 3.메시지(msg) 값 받음!!!
            super.handleMessage(msg);
            num1.setText(msg.arg1 + "");                     // 4.메시지 값 사용(msg.arg1)
        }
    }

}

 

 

 

 

여기서부터 다음 글은 필요 없음

 


 

 

지금까지는 메시지를 전송하고 순서대로 이를 실행하는 방법을 했다....

(이 방법이 가장 일반적인 작업)

(코드가 복잡하게 보이는 단점있음)

 

 

 

그래서, 좀 더 간단한 방법으로

메인 스레드에서 실행시킬 수 있으면 좋을 것이다.

이 때문에 핸들러 클래스는 메시지 전송 방법 이외에  Runnalbe객체를 실행시킬 수 있는 방법을 제공한다.

즉, 새로 만든 Runnalbe 객체를 핸들러의 post()메소드를 이용해서 전달해 주기만 하면 

이 객체에 정의된 run()메소드 내의 코드들은 메인 스레드에서 실행된다.

 

 

메시지 전송 방식에서 Runnable객체 실행 방식으로 바꾸었을 때 액티비티의 개략적인 구조

->https://hijjang2.tistory.com/155