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
'■ Android > Tip' 카테고리의 다른 글
[Android] Background 처리(101) - Runnable 객체 설명, 사용법 (0) | 2020.03.19 |
---|---|
[Android] Background 처리(100) - 핸들러(Handler) 함수들 (0) | 2020.03.19 |
[Android] 9-Patch-Resizer 사용법 - (이미지 해상도 관리) (0) | 2020.03.18 |
[Android] 애니메이션 - 6.연습 (0) | 2020.03.12 |
[Android] 애니메이션 - 5.스플래시(Splash) 화면 (0) | 2020.03.08 |