안드로이드

[안드로이드] View.post() : 실행시점을 알아보자

디벨로펄 2023. 3. 29.

목차

반응형

[안드로이드] View.post() : 실행시점을 알아보자

면접에서 받은 질문이다. View의  post를 종종 사용하는데, 실행 시점이 어디인가.??

 

post의 존재조차 몰랐기 때문에, 당연히 제대로 대답하지 못했다. ㅋㄷ

쨌든...

실행 시점을 파악하기 전에 액티비티의 라이프 사이클은 다음과 같다.

onCreate>onStart>onResume> Running

가장 기본적인 것... 엉엉 어떻게 답해는지 이젠 기억이 나질 않는다.

[안드로이드] View.post() : 실행시점을 알아보자
액티비티 라이프 사이클

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에서 호출된다.

 

반응형