![[안드로이드] View.post() : 실행시점을 알아보자 [안드로이드] View.post() : 실행시점을 알아보자](https://blog.kakaocdn.net/dn/Jnqes/btr6GWefA5r/bkKrdOpWXyt6eLS4otg0UK/img.png)
면접에서 받은 질문이다. View의 post를 종종 사용하는데, 실행 시점이 어디인가.??
post의 존재조차 몰랐기 때문에, 당연히 제대로 대답하지 못했다. ㅋㄷ
쨌든...
실행 시점을 파악하기 전에 액티비티의 라이프 사이클은 다음과 같다.
onCreate>onStart>onResume> Running
가장 기본적인 것... 엉엉 어떻게 답해는지 이젠 기억이 나질 않는다.
![[안드로이드] View.post() : 실행시점을 알아보자 [안드로이드] View.post() : 실행시점을 알아보자](https://blog.kakaocdn.net/dn/Jvnw3/btr6RBlzh8l/CRVZhspG3oIOWMmCxkdxLK/img.png)
View.post란
UI 스레드에서 비동기적으로 작업 실행할 수 있도록 예약한다. Runnable 객체를 인수로 받아서, run메서드를 UI 스레드에서 실행한다.
다음의 상황에서 사용한다.
1. UI 스레드에서 실행할 일이 있지만, 현재 메서드가 UI 스레드가 아닌 경우
thread {
binding.buttonFirst.post{
binding.buttonFirst.text="HELLO"
}
}
2. 현재 메서드가 실행 중인 동안 UI 스레드가 사용 중이거나 바쁜 경우
if(binding.buttonSecond.isLayoutRequested){
binding.buttonSecond.post {
binding.buttonSecond.text="HELLO2"
println("스레드 : " + Thread.currentThread().name)
println("포스트 테스트 : post Called!!! buttonSecond")
}
}else{
binding.buttonSecond.text="HELLO3"
}
** isLayoutRequest : 뷰가 그려질 때 레이아웃을 계산해야하는 지 여부를 나타냄. (boolean리턴)
- 뷰의 크기, 위치, 패딩, 마진 등 레이아웃 속성을 뷰가 그려질 때 계산된다.뷰 계층 구조가 변경되는 경우 다시 계산해야하는 경우가 생긴다. 뷰가 그려질 때마다 레이아웃 다시 계산하면 UI 스레드가 busy할 수 있다.
-- 브라우저의 렌더링에서 layout하는 것과 같은 개념이네
- View.post, View.postDelayed와 함께 사용된다.
3. 실행을 지연시켜야하는 경우
binding.fab.postDelayed(2000) {
println("포스트 테스트 : post Called delayed 2000!!!")
}
→ 해당 작업 실행 전까지 메서드 호출이 차단되지 않으므로, 앱의 반응성이 향상된다.
post 실행시점 파악
MainActivity의 onCreate 내에 아래 코드를 작성하였다.
그리고, 각 Lifecycle에 해당하는 method를 overriding해서 println을 찍어주었다.
binding.fab.post {
println("스레드 : " + Thread.currentThread().name)
println("포스트 테스트 : post Called!!!")
}
이후, 실행하자 아래와 같이 찍히는 것을 확인할 수 있었다.
I/System.out: 메인 액티비티 : onCreate
I/System.out: 메인 액티비티 : onStart
I/System.out: 메인 액티비티 : OnResume
I/System.out: 스레드 : main
I/System.out: 포스트 테스트 : post Called!!!
즉, post 내부는 액티비티의 running 시점에 호출된다. + main Thread에서 호출된다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Thread간 통신 예제 - 실행 시간 표시 (1) | 2023.03.29 |
---|---|
[안드로이드] Thread, Thread간 통신/ Handler, Looper의 개념 (0) | 2023.03.21 |
[안드로이드] 2-2. WebView 웹뷰 - Javascript Interface(Kotlin) (0) | 2023.03.11 |
[안드로이드] 2-1. WebView 웹뷰 - 로컬 HTML불러오기 (Kotlin) (0) | 2023.03.11 |
[안드로이드] 1. WebView 웹뷰- 띄우기 (Kotlin) (0) | 2023.03.11 |
댓글