ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 비동기 처리 질문 (Thread Sleep)
    Android 2019. 10. 6. 00:03
    반응형

    안드로이드에서 아래와 같은 코드를 동작시 어떻게 작동할것 같냐고 질문을 받았다

     

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            for(i in 0..10){
                tv_main.text = "cur $i"
                SystemClock.sleep(1000)
            }
    
        }
    }

     

    내 대답은 0부터 10까지 1초단위로 textView가 출력 될 것 같다

     

    하지만 나중에 직접 돌려본 결과는 내 대답과는 달랐습니다.

     

     

    해당시간 동안 아무것도 뜨지 않고 for문이 종료된 이후에서 화면이 표기됩니다.

     

     

    그래서 SystemClock.sleep이 무언가 다른가 하고 찾아보았다

     

     

    내부에서는 Thread.sleep을 쓰고 있었다.

     

    어 그럼 뭐가 문제지 하고 Java document를 찾아보았다.

     

    https://docs.oracle.com/javase/8/docs/api/

     

    Java Platform SE 8

     

    docs.oracle.com

     

    번역해보면 아래와 같습니다.

     

    시스템 타이머 및 스케줄러의 정밀도 및 정확성에 따라 현재 실행중인 스레드가 지정된 시간 (밀리 초) 동안 휴면 (일시적으로 실행 중단)되도록합니다.

     

    알고 있는 내용이었지만 별생각없이 넘어간 부분이다.

     

    현재 위의 코드는 MainThread에서 돌고 있고 MainThread가 Sleep하면 UI는 정지된다.

     

    그러니 정지된 상태로 유지되다가 마지막에 sleep이 풀리면서 UI가 노출된다.

     

     

    그렇다면 내 대답과 같이 매초마다 textView에 표시하게 작동하기 위해서는 어떻게 해야하는가

     

    간단하다 MainThread 이외 다른 Thread에서 sleep하면 된다.

     

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            Log.i("test", "onCreate")
    
            val thread = TempThread(tv_main)
            thread.start()
        }
        
        class TempThread(private val textView:TextView) : Thread(){
            override fun run() {
                super.run()
                for(i in 0..10){
                    Handler(Looper.getMainLooper()).post {
                        textView.text = "cur $i"
                    }
                    
                    SystemClock.sleep(1000)
                }
            }
        }
    }

     

    반응형

    'Android' 카테고리의 다른 글

    Android R8 Compiler  (0) 2019.12.05
    Android Studio Layout Inspector  (0) 2019.12.05
    Android Decompile Setting  (0) 2019.11.28
    Declarative UI Patterns  (0) 2019.10.26
    Android Paging Library  (0) 2019.10.01
    Android Dokka 사용법  (0) 2019.09.23
    RecyclerView Header , Footer 생성  (0) 2019.09.17
    안드로이드 스레드 (Android Thread)  (0) 2019.08.21

    댓글

Designed by Tistory.