앱 만들기/안드로이드 study

안드로이드 쓰레드

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

쓰레드는 자바에서도 배웠듯이, 여러가지 처리를 비동기적으로 처리하기 위해서 사용한다.

여기서 비동기 라는 말은 예를 들자면,

카톡 하면서 영화도 보고 유투브를  보거나 음악도 듣는 것을 말한다.

 

이런 개념은 안드로이드 쓰레드에서도 동일하다.

안드로이드 프로젝트를 만들때 생성되는 기본 Activity 는 화면을 그려주는 기본 임무를 가지고 있다.

그래서 이 기본 Activity 를 처리 하는 쓰레드를 Main Thread , UI Thread 라고 한다.

 

그런데, 이 기본 Activity 에서 특정 일을 무한 반복적으로 실행하다 보면

주 업무인 화면 그리기 일을 하지 못해 화면이 먹통이 되곤 한다. 이를 프로그램에서는 ANR (Application Not respond ) 이 라고 표현하며 실무에서는 락업 났다 라고 부르기도 한다.

일부 안드로이드 버전에서는 5초 이상 반응이 없으면 그 앱을 종료시키기도 한다.

 

그럼 해당 락업 상황을 만들어 보고, 해결 방법을 논의 해보자.

하기 처럼 만들면, 당연히 "하하하" , "호호호" 가 반복 될 것으로 예상되지만, 상황은 아무 화면도 나오지 않는

락업이 발생한다.

 

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

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

        int i = 0;
      while(true){
        if (i == 1) {
            text1.setText(" 하하하 ");
            i = 0;
         } else {
            text1.setText(" 호호호 ");
            i = 1;
          }           

       }

}

 

왜냐면, 메인 쓰레드 에서 반복적인 일을 하게 되면서 메인 쓰레드 본래의 화면을 그리는 일을

하지 못했기 때문이다. 

 

그럼 어떻게 해야 하나?

이렇게 반복적인 일을 할때 즉, UI를 지속적으로 업데이트 하거나, 5초 이상의 반복되는 작업을 한다던지

네트워크 백그라운드 기능을 구현할때는 별도로 쓰레드를 만들어서 작업을 해주어야 한다.

왜냐면, 안드로이드에서는 특정 쓰레드가 동작을 하지 않으면 해당 쓰레드 만 중지 시킨다.

그렇기에 메인쓰레드가 문제가 생기면 쓰레드를 중지한다?

이렇게 되면, 앱을 종료하여하 하기에 별도의 쓰레드에서 해당 작업을 해주게 끔 만든 구조이다.

그럼 쓰레드를 구현해보자. 하기처럼 말이다.

 

public class MainActivity extends AppCompatActivity {
   TextView text, text1;
   boolean isRunning = false;

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

  // 뷰의 주소값을 담는다.

   text =(TextView)findViewById(R.id.textView);

   text1 =(TextView)findViewById(R.id.textView1);

   ThreadClass thread = new ThreadClass(this);
   thread.start();

}

 

// 내부 쓰레드 클래스를 만든다.

class ThreadClass extends Thread{
   int i = 0;

public void run(){
 
   while(isRunning == true) {
   if (i == 1) {
     text1.setText(" 하하하 ");
     i = 0;
    } else {
     text1.setText(" 호호호 ");
     i = 1;
   }

   try{
        Thread.sleep(1000);
       } catch (InterruptedException e) {
       e.printStackTrace();
      }
   }
 } // thread

 

public void btnMethod(View view){
   long now = System.currentTimeMillis();
   text.setText("현재 시간 : " + now );
}

@Override
protected void onDestroy() {
   super.onDestroy();

   // 앱 종료시 쓰레드도 종료한다.
   isRunning = false;
   }
}

 

위 처럼 구현을 하게 되면 

하기 처럼 여러 작업을 동시에 할 수 있다.

사용자 버튼 이벤트를 받기도 하면서, UI 업데이트 를 반복적으로 화면에 처리 할 수 있다.

두 개의 쓰레드가 여러 작업을 동시에 하고 있는 것이다. 비동기적으로 말이다.

 

하지만, 이 코드에선 문제점이 하나 있다.

안드로이드 7.0 버전 하위 버전에서는 위와 같이 구현 하면 앱이 죽게 된다.

왜냐면,,,

7.1.1 하위 버전에서는 개발자가 만든 쓰레드에서 메인쓰레드의 UI를 업데이트 해주면 죽게된다.

상위 버전에서는 위 에뮬레이터 처럼 죽지 않는다.

 

모든 사람들이 최신 버전을 사용하고 있진 않기에, 

모든 버전을 통합 해주는 코드를 작성 해야 한다. 바로 해당 로직은 안드로이드에서 지원해주는 Handler 라는 것이다.

Handler 는 하기 포스팅에서 구현해보자.

감사합니다 ^^

 

 

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

안드로이드에서 하기와 같은 반복 작업이 필요할 때는 핸들러 객체를 사용한다. 단순히 main thread에서 while 문을 무한으로 돌리게 되면 앱이 죽는다. 죽는 다는 의미는 간혹 우리가 사용하는 어��

soo0100.tistory.com

 

반응형

댓글