저번 포스팅에서는 Room을 사용하는방법에 대해서 간단하게 정리했다. 이번에는 runOnUIThread에 대해서 정리해보도록 하겠다.
# 알게 된 것
-- 👇 이번 포스팅 --
- runOnUiThread 사용하기
-- 👇 다음 포스팅 --
- LayoutInflater 이용하여 xml 적용
# runOnUiThread
지금까지 공부하면서 UI에 변경은 main쓰레드가 담당해야한다고 뇌리에 박히도록 들었다. 실제로 타이머를 구현해보면서, 다른 쓰레드에서 UI를 변경할 경우 안드로이드가 자체적으로 오류를 발생시키고 차단한다.
그렇기때문에 UI에 대한 변경은 main 쓰레드에서 담당하게 하기위해서, 생성된 새로운 Thread에서는 작업을 끝내고 그 작업에 대해 UI변경이 필요할 경우 handler를 이용했다. 즉 메인 쓰레드로 Runnable에 수행할 것을 담아 보내 main에서 처리하게 한 것이다.
이 일련에 과정은 매우 많이 쓰이기 때문에 안드로이드에서 자체적으로 구현해 놨다
다음과 같이 구현 돼 있다. 현재 쓰레드가 main쓰레드가 아니면 핸들러에게 현재 Runnable을 보내는 것이고 현재 쓰레드가 메인이라면 그대로 수행하는 것이다. action.run()은 Runnable에 내가 구현된 이벤트다. 코틀린에서는 람다식으로 작성했기 때문에 override를 생략했는데 원래는 run코드를 override해야한다. Runnable자체가 인터페이스다.
# 결론
Thread(Runnable {
db.historyDao().getALl().reversed().forEach {
//아마도 쓰레드에서 UI를 그려주는 작업을 하면 안될거 같음 -> UI쓰레드 열어줌
runOnUiThread{
val historyView = LayoutInflater.from(this).inflate(R.layout.history_row,null,false)
historyView.findViewById<TextView>(R.id.expressionTextView).text = it.expression
historyView.findViewById<TextView>(R.id.resultTextView).text = " = ${it.result}"
historyLinearLayout.addView(historyView)
}
}
}).start()
친절한 코틀린 덕에 현재 쓰레드를 확인하는 것과, 그 메시지를 주고 받는 일련의 과정이 runOnUiThread로 생략된것이다. 친절한 코틀린 보다는 친절한 구글 친절한 안드로이드가 맞겠다. 물론 점점 앱을 공부하다보면 직접 핸들러에 대해서 처리해야하는 과정이 있을거 같은데, 그런 멀티 쓰레딩을 어떤식으로 설계하고 관리해야하는지 궁금하기도 하다.