반응형
Handler(화면처리)
- 네트워크 처리나 오래 걸리는 작업 -> 개발자가 발생시킨 스레드에서 처리
- 안드 8.0 미만 -> 개발자 발생 스레드에서 화면처리 할 경우 오류 나기 때문에 handler로 처리
- Handler를 이용하는 모든 처리는 Main Thread에서 수행 (따라서 handler를 사용하면 화면처리를 main thread에서 가능)
* 개발자가 발생시킨 스레드에서 중간중간 메인 스레드에서 작업을 요청하고 싶으면 handler로 작업을 요청!!
var isRunning = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
// 화면 처리를 위한 핸들러
val handler = object : Handler(Looper.myLooper()!!) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
// 핸들러에게 이 작업 수행해주세요 라고 요청할 수 있고 해당 작업은 메인 스레드에서 처리
when (msg.what) {
0 -> {
binding.textView2.text = "Handler 0"
}
1 -> {
binding.textView2.text = "Handler 1"
}
2 -> {
binding.textView2.text = "Handler 2 : ${msg.arg1}, ${msg.arg2}, ${msg.obj}"
}
}
}
}
// 익명 중첩 클래스로 구현
isRunning = true
val thread1 = object : Thread() {
override fun run() {
super.run()
while (isRunning) {
// 개발자가 발생시킨 스레드에서 오래 걸리는 작업을 수행
val now2 = System.currentTimeMillis()
Log.d("test", "오래 걸리는 작업 : ${now2}")
// 그 와중에 중간중간 화면처리를 하고 싶을 때 // 8.0 미만에서는 화면처리를 개발자 발생 스레드에서 처리 X -> 핸들러를 사용해 메인스레드에서 처리하도록 요청해야 함
// 핸들러에 의해 요청된 작업 무조건 메인스레드에서 수행
SystemClock.sleep(500)
handler.sendEmptyMessage(0) // what : 이 숫자로 작업 구분 가능 // 넘길 데이터 없을때
SystemClock.sleep(500)
handler.sendEmptyMessage(1)
SystemClock.sleep(500)
// 핸들러에 작업을 요청할 때 데이터 넘기고 싶을 때
val msg = Message()
msg.what = 2
// 정수 2개 , 객체 1개 세팅 가능 (객체에 배열 같은거 넣어서 무한대로 세팅 가능)
msg.arg1 = 100
msg.arg2 = 200
msg.obj = "객체"
handler.sendMessage(msg) // 넘길 데이터 있을 때
}
}
}
thread1.start()
}
override fun onDestroy() {
super.onDestroy()
isRunning = false //액티비티가 종료가 될 때 isRunning이 false가 되기 때문에 스레드도 종료될 수 있음
}
✔️ sleep() 메서드도 main thread가 일을 하는 것!
✔️ 핸들러 요청시 넘길 데이터 없는 경우 -> sendEmptyMessage() 로 요청
✔️ 핸들러 요청시 넘길 데이터 있는 경우 -> sendMessage() 로 요청 (Message 객체 생성한 다음에 데이터 값 넣어줌)
반응형
'Android' 카테고리의 다른 글
[안드로이드/Recevier] BroadCastReceiver 란? (0) | 2023.04.17 |
---|---|
[안드로이드/Thread] RunOnUiThread (0) | 2023.04.17 |
[안드로이드/Thread] Handler를 사용한 반복작업 처리 (0) | 2023.04.16 |
[안드로이드/Thread] Thread 란? (0) | 2023.04.16 |
[안드로이드/메시징] Message Notification (0) | 2023.04.15 |