앱 만들기/안드로이드

안드로이드 반복 작업이 필요할때 - 핸들러 사용하기

나도 처음이야 2020. 8. 21.

안드로이드에서 하기와 같은 반복 작업이

필요할 때는 핸들러 객체를 사용한다. 단순히 main thread에서 while 문을 무한으로 돌리게 되면 앱이 죽는다.

죽는 다는 의미는 간혹 우리가 사용하는 어플이나 앱이 먹통이 되었을 때를 말한다.

그래서 우리는 전 포스팅에서 쓰레드를 사용하여 동작을 시켜보았다.

하지만, 7.1.1 하위 버전에서는 쓰레드 만 사용해서 UI 처리를 하면 앱이 죽었다.

즉, 모든 버전에서 원활한 동작을 하기 위해서는 Handler 라는 객체를 사용해야 한다.

Handler 를 사용해 볼까? ^^

 

 

핸들러는 개념은 하기와 같다.

핸들러가 안드로이드 OS에게 어떤 일을 해달라고 편지를 쓴다.

안드로이드 OS 는 편지를 잘 갔고 있다가, 메인 쓰레드에게 전달한다.

메인 쓰레드는 자신의 우편동 (큐) 에 담았다가 자신의 일이 끝나고 잠깐 쉴때

그 편지를 꺼내서 아~ 이 일 하고 일을 처리한다.

ㅋㅋㅋ 

손쉽게 풀어쓰자면 위와 같다. 

필자는 어려운 프로그램 공학 용어보다는 이렇게 이해하는 것이 보다 정확하고 오래 기억에 남는다.

그럼 소스로 구현해보자. 

 

1. 메인 쓰레드 에서 새로운 스레드를 만들고 핸들러를 통해서 Thread의 run 메서드를 실행한다.

 

public class MainActivity extends AppCompatActivity {

    TextView text1
    Handler handler = null;
    int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 뷰의 주소값을 담는다.
    text1 =(TextView)findViewById(R.id.textView1);

   handler = new Handler();

   //UI 를 업데이트 할 쓰레드를 만들어 준다.

   ThreadClass thread = new ThreadClass();
   // 핸들러를 통해 안드로이드 OS에게 작업을 요청한다 ( 결국 일은 메인 스레드가 처리함 )
   handler.post(thread);
}

 

 

2. Thread에서는 UI를 반복하는 구문을 넣고,

  핸들러를 사용하여 OS에게 해당 작업을 다시 할수 있도록 요청한다. 

class ThreadClass extends Thread{

public void run(){
  if( i == 1){
   text1.setText(" 하하하 ");
   i = 0;
   }
  else {
   text1.setText(" 호호호 ");
   i =1 ;
  }
try {
   Thread.sleep(1000); // 쓰레드 슬립으로 일정 시간을 대기한다.
  } catch (InterruptedException e) {
   e.printStackTrace();
}
  // 현재 작업을 OS님에게 다시 요청한다.
   handler.post(this)
;
}

 

정리 해보자면,

반복 작업이 필요한 경우 신규 쓰레드에서 해당 작업을 하고 핸들러를 이용해서 안드로이드 운영체제에게

메인쓰레드가 휴식 할때 해당 쓰레드의 반복 처리를 해달라고 요청을 하는 것이다.

바로 handler.post(); 가 이것 좀 해줘~ 하고 안드로이드 OS에게 편지를 띄우는 것이다.

그럼 메인쓰레드가 메시지 큐(우체통) 에서 메시지를 꺼내서 해당 일을 처리한다.

 

감사합니다. ^^

 

반응형

'앱 만들기 > 안드로이드' 카테고리의 다른 글

자바 익명 클래스 란?  (4) 2020.08.25
안드로이드 쓰레드  (6) 2020.08.24
애드몹 광고 적용하기 - 기본 준비.  (7) 2020.08.20
자바 Package 에 대해서.  (2) 2020.08.18
자바 배열의 메모리.  (2) 2020.08.13

댓글