Android/Android 일반

Handler 구현

lipnus 2019. 3. 26. 14:02
반응형

Handler 

기본 생성자를 통해 Handler를 생성하면, 생성되는 Handler는 해당 Handler를 호출한 위치의 스레드의 MessageQueue와 Looper에 자동 연결된다.


1. 메인 스레드가 기본적으로 루퍼를 가지고 있다. 
2. 메인스레드에 있는 루퍼는 static 변수로 정의되어 있다. 
3. 따라서 어느 쓰레드에서 handler를 부르던 메인스레드에 있는 루퍼 객체를 참조한다.
4. 메인스레드가 아닌 스레드에서는 안드로이드 화면에 그리는 것이 불가능 하기 때문에 핸들러를 사용하는 것이며, 핸들러를 통해 전달된 메세지는 루퍼의 메세지 큐에 저장된다.



class MainActivity : AppCompatActivity() {

var count = 0

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val mHandler = Handler()

val th1 = Thread( object:Runnable{
override fun run() {
tv.text = "카운트: " + count++
}
})


val rb = object: Runnable{

override fun run(){
for(i in 0..30){
mHandler.post(th1)

try{ Thread.sleep(500) }
catch (e:Exception){}
}
}
}


val th2 = Thread(rb)
th2.start()

}
}


1. 메인 스레드에서 handler를 생성한다.


2. 해당 handler는 호출한 스레드의 메시지큐와 루퍼에 자동 연결된다.


3. 따라서 다른 스레드에서 Handler를 통해 메시지를 전달하면 메인스레드(UI스레드)작업이 가능하다.







약간 수정한 형태

class MainActivity : AppCompatActivity() {

var count = 0

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)


val mHandler = Handler()


val rb = object: Runnable{

override fun run(){

for(i in 1..100){
mHandler.post(object: Runnable{
override fun run() {
tv.text = "카운트: " + count++
}
})

try{ Thread.sleep(500) }
catch (e:Exception){}
}
}
}


val thread = Thread(rb)
thread.start()
}
}






Runnable 인터페이스를 사용하는 기본형태

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val tr = TestRunnable()
val thread = Thread(tr)
thread.start()
}
}

class TestRunnable: Runnable{
override fun run() {
Log.d("SSS", "요호호")
}
}

이런식으로 Runnable 인터페이스를 사용한 구조.





참고: https://itmining.tistory.com/16 [IT 마이닝]

반응형