마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오(코틀린) 쓰레드 관련 질문입니다..

0 추천

안녕하세요 안드로이드 공부중인 와중에 메인 쓰레드 이해가 많이 부족해서 질문 하나 올립니다. 

안드로이드 스튜디오에서 간단하게 테스트 해보려고 버튼 클릭시 프로그래스바가 3초 돌고 멈추는 코드를 만들고 싶어서 저렇게 작성하니까 보이지도 않더라구요, 그래서

이런 식으로 밖으로 빼버리니까 이건 작동이 잘 되는데 , 왜 위는 되고 아래는 안되는지 설명 좀 부탁드려도 될까요..? 제일 궁금한건 위의 코드가 동작이 안되는 이유입니다. 메인쓰레드를 블럭시키면 멈춘다는 것을 알겠는데 왜 sleep전의 코드는 실행이 안되는지 모르겠습니다.

다가온다 (150 포인트) 님이 2021년 10월 3일 질문

1개의 답변

+1 추천
 
채택된 답변

Thread.sleep()은 blocking 방식이기 때문에 UI를 얼게 만듭니다. 따라서 UI가 원하는대로 바로 업데이트 되지 않을 수가 있습니다. 따라서 모바일에서는 Thread.sleep은 가능한한 사용하지 말아야 합니다.

runUniThread의 소스코드를 보면 아래와 같습니다.

public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

즉, 메인쓰레드가 아닌 경우는 handle.post를 이용해 스케쥴링 하므로 바로 실행되지 않을 수 있습니다. 따라서 님이 작성한 코드block이 실행될 때 Thread.sleep이 같이 실행되면서 해당 쓰레드 안에 코드가 block이 되므로 UI 업데이트가 보장되지 않을 수도 있을 것으로 보입니다. 즉, UiThread에 화면을 업데이트 하지 말라는 신호같을 걸로 간주될 수 있을 것 같습니다.

보통은 Handler.postDelayed나 자바면 RxJava, 코틀린은 Coroutine을 사용해서 쓰레드 처리를 많이 합니다. 기본적인 쓰레드 사용법을 공부하시고 코틀린을 사용하시니까 Coroutine을 사용하시면 적합한 선택이 될 것 같습니다.

spark (227,530 포인트) 님이 2021년 10월 3일 답변
다가온다님이 2021년 10월 3일 채택됨
...