728x90
⚠️ 2021.01.22에 작성된 글입니다 ⚠️
Thread 클래스 및 Handler 클래스로 텍스트 변경하기
핸들러는 메시지 큐(Message Que)에 메인 스레드가 처리할 메시지를 전달한다.
이때 핸들러가 처리하는 메시지 큐는 루퍼(Looper)로 처리한다.
루퍼는 메시지 큐에 들어오는 메시지를 지속적으로 보면서 순서대로 하나씩 처리한다.
즉 메시지 전송 방식으로 스레드에 데이터를 전달 후 순차적 작업수행을 원한다면 루퍼를 만든 후 실행해야 한다.
코드 흐름 :
루퍼를 실행하는 SendThread클래스 생성
↓
inner class로 SendHandler클래스 생성
(메시지 전송으로 받은 텍스트 세팅 작업)
↓
onCreate에 SendThread 객체 생성
↓
submit 버튼 클릭
↓
thread의 handler에 메시지 전달
↓
텍스트 뷰 변경됨
SendThread 클래스
class SendThread extends Thread {
SendHandler handler = new SendHandler();
@Override
public void run() {
super.run();
Looper.prepare();
Looper.loop();
}
class SendHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
final String output = msg.obj + "\nfrom thread";
handler.post(new Runnable() {
@Override
public void run() {
tvResult.setText(output);
}
});
}
}
}
submit 버튼 클릭 이벤트
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_sendtext_submit:
String input = edtMessage.getText().toString();
if (input.length() > 0) {
Message message = Message.obtain();
message.obj = input;
// 1. sendMessage 사용하기
thread.handler.sendMessage(message);
// 2. handleMessage 사용하기
thread.handler.handleMessage(message);
} else
Toast.makeText(getApplicationContext(), "no message", Toast.LENGTH_LONG).show();
break;
case R.id.tv_sendtext_timewatch:
startActivity(new Intent(getApplicationContext(), TimeWatchActivity.class));
finish();
break;
case R.id.tv_sendtext_image:
startActivity(new Intent(getApplicationContext(), ImageActivity.class));
finish();
break;
}
}
handler로 메시지를 전송할 때에는 1)sendMessage()와 2)handleMessage() 모두 사용 가능하다.
결과화면
전체 코드
참고자료
Do it! 안드로이드 앱 프로그래밍 (전면 개정 7판)
공부하며 정리한 글입니다. 내용에 대한 피드백은 언제나 환영입니다.
728x90
'Android' 카테고리의 다른 글
[Android] 키보드 표시하기, 숨기기 (0) | 2022.10.23 |
---|---|
[Android] Thread - 이미지 바꾸기 (0) | 2022.10.23 |
[Android] Thread - 화면 변경하기(초시계) (0) | 2022.10.22 |
[Android] Firbase 사진 업로드하기 (0) | 2022.10.22 |
[Android] Firebase와 안드로이드 프로젝트 연결하기 (0) | 2022.10.22 |