상세 컨텐츠

본문 제목

백그라운 작업자Thread 이용하기

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2011. 7. 1. 16:23

본문

반응형

//또다른 관련링크 http://blog.naver.com/menusys?Redirect=Log&logNo=113357050

//출처: http://msinterdev.org/blog/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EA%B8%B0%EC%B4%88-%EC%A0%95%EB%A6%AC




2-1. 백그라운드의 thread의 필요성

 - 모든 콤포넌트는 하나의 Main thread위에서 동작한다.

 - 따라서 시간이 많이 걸리는 작업을 하면 화면에 보이는 Activity뿐만아니라 다른 모든 콤포넌트까지 불록시킨다.

 - 이때 "Application Unresponsive" 메시지가 출력될 것이다.


2-2 백그라운드 thread 활용 추천

 - 입력 이벤트(키 눌림)에 대해서 5초 이내에 반응하지 않을 때

 - onReceive 핸들러를 10초 이내에 완료하지 않는 Broadcast Receiver

 - 이런 현상이 발생되는 주요 작업 사항으로는

   . 파일작업

   . 네트워크 조회

   . 데이터베이스 트랜잭션

   . 복잡한 계산


 2-3 백그라운드 스레드 사용의 결론

  - 느리고 시간이 많이 드는 모든 작업을 Main thread에서 Child thread로 옮기는 것이 좋은 습관이다.


 2-4 새로운 thread와 GUI 작업을 위한 thread 동기화





  - 골격 코드



01.// GUI Handler 처리..
02.private Handler handler =new Handler();
03.

04.// 이 메서드는 메인 GUI 스레드에서 호출된다.

05.private void mainProcessing(){
06.// 이는 시간이 많이 드는 작업을 자식 스레드로 옮긴다.
07.Thread thread =new Thread(null, doBackgroundThreadProcessing,"Background");
08.thread.start();
09.}
10.

11.// 백그라운드 처리 메서드를 실행하는 Runnable

12.private Runnable doBackgroundThreadProcessing =new Runnable(){
13.@Override
14.public void run() {
15.backgroundThreadProcessing();
16.}
17.};
18.

19.// 백그라운드에서 몇 가지 처리를 수행하는 메서드

20.private void backgroundThreadProcessing(){
21.//[필요한 코드]
22.// 처리가 끝나고 결과를 UI로 출력을 해야 할 때 아래 핸들러를 추가해서 사용한다.
23.handler.post(doUpdateGUI);
24.}
25.

26.// GUI 업데이트 메서드를 실행하는 Runnable.

27.private Runnable doUpdateGUI =new Runnable(){
28.@Override
29.public void run() {
30.updateGUI();
31.}
32.};
33.

34.private void updateGUI() {

35.// [[ 필요한 UI 코드 ]]
36.}


   Thread를 만드는 핵심 코드

    private void mainProcessing(){
     Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background");
     thread.start();
    }

   =>> Thread(ThreadGroup group, Runnable runnable, String threadName)


   Thread와 GUI연결을 위한 핵심 코드

    handler.post(doUpdateGUI);  

     ==>> post(Runnable r)


  - Handler를 사용하는 이유

   Child Thread는 GUI를 갖고 있지 않다. 모든 GUI는 Main thread가 갖고 있어서 뷰, Toast등은 모두 Main thread에서 처리해야됨

   따라서 handler를 통해서 child thread의 처리 결과를 Main thread에서 처리할 수 있게 해준다.


 - Handler 클래스의 추가 메소드

   . pastDelayed: 포스팅을 늦추어 처리한다. / handler.postDelayed(doUpdateGUI,5000)

   . pastAtTime : 포스팅을 특정 시간에 실행하도록 한다.


 - UIThreadUtilities 클래스

   이 클래스는 runOnUIThread를 갖고 있어서 View, Activity, Dialog와 같은 thread에서 메소드를 강제적으로 실행해 줌


 - Thread에서 꼭 기억해야 할 사항


" 애플리케이션 컴포넌트에서, 알림과 인텐트는 항상 GUI 스레드에서 수신되고 처리된다.
  다른 모든 경우에 있어, GUI스레드(뷰 같은)에서 생성된 객체와 명시적으로 상호작용하거나 메시지를 표시하는 작업은
  메인 스레드에서 띄워져야만 한다."


반응형


관련글 더보기

댓글 영역