ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AsyncTask 그리고 Looper, Handler, HandlerThread #1
    Android Development 2017. 9. 25. 00:01

    안녕하세요! 이번 포스팅에서는 안드로이드 개발에 많이 쓰이는 AsyncTask 그리고 Looper, Handler, HandlerThread에 대해 알아보겠습니다.


    먼저 AsyncTask, Looper, Handler, HandlerThread를 왜 사용하는지 알아보겠습니다.


    Android Application의 UI Thread

      안드로이드 시스템에서는 UI Thread(대부분 app의 Main Thread) 이외에 Thread에서는 UI를 변경하는 것을 금지하고 있습니다. 다수의 Thread에서 UI를 조작하게 되면 동기화 이슈가 발생할 수 있으므로 이슈를 원천적으로 차단하기 위해 UI Thread에서만 UI를 다룰수 있습니다. 
      
    아래의 예제에서 Button을 클릭하면 Button의 Text를 바꾸는 Thread를 생성하고 실행합니다. 


    위의 예제를 실행하고 빌드한 후 버튼을 누르면 다음과 같은 화면이 나옵니다.



    Thread에서 UI를 변경하지 못하고 안드로이드 시스템에서 강제로 앱을 종료시키는 것을 확인할 수 있습니다.



    Logcat을 확인해보면 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.라는 예외가 발생하는 것을 볼 수 있습니다. 오류메세지를 해석해보면 뷰 계층을 만든 original thread만 view를 건드릴 수 있다는 것을 확인할 수 있습니다. 즉, 오직 UIThread에서만 UI를 건드릴 수 있다는 것을 확인할 수 있습니다.


    이처럼 안드로이드 시스템에서는 UIThread에서만 UI를 다룰 수 있습니다. 그리고 또 한가지 안드로이드 시스템에서는 UIThread에서 오래걸리는 작업을 하면 ANR을 발생시킵니다. 


    아래 예제에서 Button을 클릭하면 Thread.sleep(10000) 함수로 UIThread의 동작을 10초동안 멈춥니다.



    위의 예제를 빌드하고 실행한 후 버튼을 눌르면 다음과 같은 화면을 볼 수 있습니다.




    ANR은 Application Not Responding의 줄인 말로 Application이 일정 시간 응답하지 않는 경우 안드로이드 시스템이 발생시킵니다. 


    즉, 오래걸리는 작업은 Sub Thread에서 작업을 진행한 후 작업한 데이터를 UIThread로 넘겨서 UI를 업데이트 해야합니다.


    오래 걸리는 작업에는 네트워크로 데이터를 요청하고 받기, 이미지 다운받기 등이 있습니다. 

    이러한 작업들은 AsyncTask 또는 Looper, Handler, HandlerThread를 이용해서 처리할 수 있습니다.


    다음 포스팅에서 AsyncTask를 알아보고 그 다음 포스팅에서 Looper, Handler, HandlerThread에 대해서 알아보도록 하겠습니다. 감사합니다!


    다음 포스팅 보기


    댓글

Designed by Tistory.