본문 바로가기
안드로이드

[Android] Thread 사용하기

by 코딩히어로 2022. 8. 30.
728x90

1


기존에 MainActivity에서 Handler를 이용한 프로그램을 많이 사용했습니다

이유는 Handler.sendEmptyMessageDelayed를 이용하게 되면 내가 원하는 만큼 지연을 줄 수도 있고

핸들러를 원하는 시간 간격만큼 딜레이를 주면서 반복적인 작업이 가능했기 때문입니다

 

하지만 핸들러 사용에 가장 큰 문제는 해당 처리를 현재 Activity의 MainThread에 전달할 뿐이고

처리는 Handler라는 곳에서 하는것이 아닌 온전히 MainThread의 몫이라는 것입니다

그렇다 보니 Handler를 많이 사용하게 될 경우에는 메모리 릭에 의해 어플이 종료되는 현상이 발생합니다

 

이러한 문제를 해결하기 위해선 MainThread의 과한 업무부담을 줄여주는 것인데

그 방법으로 Handler가 아닌 Thread를 생성하여 처리하는 방법이 가장 이상적입니다

Thread의 장점은 해당 Activity에서 구현할 경우 MainActivity와는 별개의 Sub Thread로 동작하면서

Activity 내의 자원은 MainActivity와 공유한다는 점입니다

 

결론적으로 Handler와 Thread의 차이는 핸들러는 처리 구문을 MainThread에서 부담하고

Thread는 MainThread와 별개로 처리를 한다는 것입니다

 

Thread 사용


public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
    
    }
    
    class Program_Process1 extends Thread{
        private boolean stop = true;

        public void setRun(boolean stop){
            this.stop = stop;
        }

        @Override
        public void run() {
            while(stop!=false) {
                // 프로그램 처리 구문
                SystemClock.sleep(500);
            }
        }
    }
}

stop이라는 boolean 함수를 통해 스레드가 실행되었을 때 종료될 수 있는 조건을 걸어줍니다

run() 함수 내에서는 while문을 통해 스레드가 반복되지만 외부에서 setRun(false)를 통해

해당 sub Thread를 종료할 수 있습니다

 

Thread를 실행만 시키고 종료하지 않을 경우 App이 종료되어도 해당 Thread는 동작하기 때문에

반드시 어플이 종료되는 시점이나 스레드를 사용하고 나서는 setRun을 통해 종료해주는 습관이 필요합니다

 

Thread가 Activity내에 선언되었기 때문에 Activity 내의 자원을 공유합니다

선언된 Thread는 start함수를 통해 호출하여 사용합니다

public class MainActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
    	Program_Process1 program_process1 = new Program_Process1();
        program_process1.start();
    }
    
    class Program_Process1 extends Thread{
        private boolean stop = true;

        public void setRun(boolean stop){
            this.stop = stop;
        }

        @Override
        public void run() {
            while(stop!=false) {
                // 프로그램 처리 구문
                SystemClock.sleep(500);
            }
        }
    }
}

 

728x90
반응형

댓글