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

쓰레드 처리시, Handler 를 사용하는 것과 view의 postDelayed를 사용하는 것의 차이점이 있나요?

0 추천
1.

Handler mHandler = new Handler();

Runnable mRunnable = new Runnable () {

    public void run() {

        // todo

   }

}

 

 

2.

EditText edit = (findViewById)R.id.(R.id.editText)

edit.postDelayed(new Runnable() {

    public void run() {

        // todo

    }

}

 

delay를 주어 어떤 동작을 수행하고 싶은데요,

Thread를 이용한 처리 중 위의 두 개의 차이점이 있나요?

알려주심 감사하겠습니다.

 

좋은 하루 보내세요~~
스텔라 (170 포인트) 님이 2013년 6월 26일 질문

2개의 답변

+5 추천
 
채택된 답변
좋은 질문이시네요
앱에서 어떠한 동작을 처리하고자 할때 메인 쓰레드에서 처리하느 것과
별도의 쓰레드를 만들고 거기서 일을 처리 하는 것으로 나눌 수 있습니다
메인 쓰레드에서 일을 처리할때는 activity,service 등의 싸이클 내에 코드를
넣어서 동작하는 경우 메인 쓰레드에서 동작하는 것이라고 말할 수 있습니다
그럼 여기서 activiy에 Handler h = new Handler()를 만들고 여기에 Runnable을
만들어서 handler에 이 Runnable을 동작 시킨다면 이 Runnable은 메인쓰레드에서
동작 하게 됩니다
 
안드로이드에서 handler를 검색해 보시면 생성자가 4가지 있습니다
자세한 내용은 검색해 보시고 간략하게 설명드리면 handler에 looper나 Callback
등을 생성하여 설정하지 않고 생성을 하면 이 handler는 메인 쓰레드의 looper와 
메세지 콜백에 연결되어 사용됩니다
따라서 이 핸들러에 연결된 runnable은 메인쓰레드의 메세지 큐에 연결되 메인쓰레드
에서 처리를 하게 됩니다
 
그런데 이 메인쓰레드는 굉장히 바쁜녀석입니다 메인쓰레드는 앱에 연결된 activity나
service, 화면 이벤트등 단말에서 앱으로 들어오는 정보들을 모두 거쳐서 처리하는
녀석으로 짧은 시간안에 동작들을 처리하고 다음 입력을 기다려야 합니다
그래야 우리가 앱에서 어떠한 동작을 요구해도 빠르게 처리하여 결과를 보여주거나
동작을 하게 됩니다
 
이중에는 화면의 view들의 처리를 요하는 정보도 들어오고 처리하게 됩니다
위에서 이야기 하신 이러한 view들에는 이 메인 쓰레드의 handler와 연결되어 처리
할 수 있도록 되어 있습니다
 
이러한 것이 위에서 코드로 적으신 edit.postDelayed(new Runnable() 부분입니다
여기서 요청하는 부분은 모두 메인쓰레드에 연결되어 처리 됩니다
따라서 acitivy에서 Handler h = new Handler()를 통한 runnable의 처리와
view.post(new Runnable)은 같은 메인 쓰레드에서 처리 된다고 할 수 있습니다
 
위와 같은 것을 간단하게 알아보는 방법은 로그를 확인 하는 방법이 있습니다
예를 들어 handler를 통하여 runnable을 만들고 거기에 연결하여 처리할때 강제로
에러가 나게 만들어 테스트하여 발생되는 로그와 view의 post에 runnalbe을 연결하여
위와 같이 강제로 에러가 나게 하여 발생되는 로그를 확인해 보면 모두 같은 main
thread에 연결되어 처리 된다고 확인 할 수 있습니다
 
그러면 이러한 메인쓰레드에 동작시킬때 우리가 주의 할점은 위에서도 말씀드렸드시
메인쓰레드는 굉장히 해야 할일이 많고 바쁜녀석입니다
이러한 메인쓰레드에 우리가 복잡한 일이나 io와 같이 시간이 오래 걸릴 수 있는
일을 등록해 놓은면 그 일을 처리하는 동안 다른 동작 또는 꼭 필요한 동작을
못하여 화면이 멈춰 있는 것과 같은 모습을 보일 수 있습니다
 
그래서 안드로이드는 이러한 동작을 처리하기 위한 별도의 thread를 만들고 사용할 수
있게 되어 있습니다
이것이 AsyncTask 입니다
이것은 검색하시면 좋은 문서들이 많이 있기 때문에 따로 설명을 안드리겠습니다
 
도움이 되셨으면 좋겠네요
수고하세요
 
블랙프리 (1,050 포인트) 님이 2013년 6월 26일 답변
스텔라님이 2013년 6월 26일 채택됨
질문자께서, Handler를 쓰신 것은 data 처리를 위해소 thread 처리하던 중 UI Component의 갱신을 하기 위한 용도로 보입니다.

UI Component를 별도의 thread 에서 처리하게 되면, exception이 발생하는데요.

답변자께서 말씀하시는 것처럼 main ui thread 에서 해당 부분을 처리하게 되면 느려지겠지만,  위와 같은 사항에 대해서 main ui thread가 아닌 별도의 thread 에서 처리할 수 있는 방법이 있나요?

무조건 쓰면 안되는게 아니라,
Data 처리 지연 / Network 처리 등에 대한 부분에 대해서 thread를 권장하고,

어쩔 수 없이 써야하는 부분도 설명이 더 있었으면 좋았을 것 같습니다.
말씀하신대로 별도의 쓰레드에서 View의 갱신이 이루어 지게 되면 에러가
발생을 합니다 발생되는 이유는 TLS에 대한 부분을 아시면 좀더 이해가
빠르실겁니다
제가 알고 있는 부분은 그렇게 알고 있습니다

그리고 별도의 쓰레드에 UI갱신이 이루어 지면 에러가 나는 부분은
AsyncTask를 공부하면 자연스럽게 알게 되실거라 별도로 달지 않았습니다
그럼 메인쓰레드 에서만 View 갱신이 이루어 져야 한다면 메인쓰레드
에서만 갱신을 하면됩니다
그래서 만든것도 AsyncTask 입니다

꼭 AsyncTask를 통해서만 해야하는 것은 아닙니다
익숙해 지면 별도의 쓰레드를 만들고 갱신은 메인쓰레드에 하는 법도
어렵지는 않습니다
다만 코드가 내가 만들것을 남이 내가 만든 것을 이해를 잘 못할 뿐이죠
그래서 이러한 이해를 쉽고 목적에 맞게 쓰기 위해 AsyncTask를 만든것입니다

메인쓰레드 이외에서 view갱신을 하면 에러가 발생하니 꼭 메인쓰레드에서만
모든 동작을 해야 되 이런것이 아닙니다
동작을 하고자 하는 목적에 맞게 코드를 짜고 개발을 하셔야 합니다
그러한 것을 쉽게 도와주고자 만든것이 AsyncTask이구요

실제로 개발하시는 분들중 메인쓰레드이든 그냥 넣고 돌리면 잘 되는데
꼭 AsyncTask써야되 라고 하시는 분들도 계십니다
하지만 개발을 계속 하시다보면 어떠한 벽이 느껴 지실때가 있습니다
나중을 생각해보시더라도 꼭 여러가지로 생각을 해보고 찾아보세요

구글이 메인쓰레드에서 view의 갱신을 다른 쓰레드에서 못하게 한 이유는 있습니다
우리가 쉽게 알고 있는 것도 있고 다른 내용도 있을 수 있습니다
찾아보세요
+2 추천
한가지 더 추가 하자면 우리는 일반적으로 개발을 할때 메인쓰레드에 작업을 요청을 합니다

그런데 이 메인쓰레드에 딜레이가 오래 걸리게 되어 엡의 반응속도를 느리게 하는 것을 잘

모를 때가 있습니다

이러한 것을 도움을 주기 위해 안드로이드는 StrictMode라는 것을 지원합니다

개발자에게 위와 같은 것을 경고해 주는 것이라고 생각 하시면 됩니다

만약 개발도중 StrictMode를 사용해서 경고를 받는 부분이 있으면

우리는 별도의 쓰레드를 만들고 그 작업을 수행하면 됩니다

StrictMode는 진저 이상에서 동작합니다
블랙프리 (1,050 포인트) 님이 2013년 6월 26일 답변
친절한 답변 정말 감사드립니다.
도움이 많이 되었습니다. ^^
...