2021. 03. 11

멍텅구리·2021년 3월 11일
0

AndroidStudio

목록 보기
7/7

1. 스레드

앱을 실행할 때 실행되는 스레드를 메인스레드라고 한다. 안드로이드 스튜디오에서 새로운 스레드를 만들기 위해서는 일반적인 표준 자바 스레드를 이용해도 된다. 다만 중요한 차이점이 존재하는데 메인스레드에서 관리하는 리소스에는 스레드에서 직접적으로 접근할 수 없다. 두 스레드가 동시에 한 리소스에 접근하게 되었을때 데드락같은 문제가 발생할 수 있기 때문이다.

따라서 스레드에서 메인스레드에서 관리하는 리소스에 접근하기 위해서는 핸들러를 이용해야 한다. 핸들러는 각각의 스레드 안에 만들어질 수 있고 다른 스레드에서 요청하는 정보를 순서대로 실행시켜 주므로 이런 문제를 해결해준다. 핸들러는 Handler 클래스를 스레드는 Thread 클래스를 이용하면 된다.

1. 스레드 시작

스레드는 기본적으로 Thread 클래스를 상속해야 하며 Thread.start()함수로 실행되며 Thread를 상속한 클래스에서는 run() 메소드를 정의해주어야 한다. run 메소드에서는 스레드의 작동방식을 정의해줘야 한다. 다음은 CustomThread 클래스의 예시이다.

 class CustomThread extends Thread{
        boolean running=  false;
        int value = 0;
        public void run(){
            running = true;
            while(running){
                '''

                Message message = handler.obtainMessage();
                Bundle bundle = new Bundle();
                bundle.putInt("value", value);
                message.setData(bundle);
                handler.sendMessage(message);
                try {
                    Thread.sleep(1000);
                }catch(Exception e){}

            }
        }//스레드 시작시 run 메소드 실행
    }

위에 handler는 핸들러로 위에서 따로 정의해주었다. 이때 핸들러와 스레드는 Message 객체를 통해 서로 메시지를 주고받을 수 있다. 메시지에 데이터를 넣는법은 Bundle 객체를 정의하여 부가데이터 형식으로 메시지에 데이터를 넣어주면 된다. 핸들러로 보낸 메시지를 통해 핸들러에서 메인 스레드의 리소스에 접근해주면 된다. 다음은 CustomHanler의 예시이다.

class CustomHandler extends Handler{
        @Override // handleMessage를 통해 메시지를 받음
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle bundle = msg.getData();
            int value = bundle.getInt("value");
            textView.setText(value) // 메인스레드 리소스에 접근
        }
    }

위에 textView는 메인 스레드에서 관리하는 UI 리소스로 핸들러를 통해 접근하게 해주었다. 하지만 위와같이 핸들러를 정의하면 리소스에 접근해야 될때마다 해당 기능을 수행하는 핸들러를 그때그때마다 정의해주어야 하는 불편함이 생긴다.

2. 핸들러 POST

위와 같은 불편함을 없애기 위해 표준 핸들러 클래스의 post 메소드를 이용해주면 된다. 그렇게 되면 필요할때마다 표준 핸들러에서 실행될 동작들을 다음과 같이 정의해주면 된다.

class CustomThread extends Thread{
handler2.post(new Runnable()
{
@Override
public void run() {
textView.setText(value);
 }
});
 }
profile
치열하게 연습하자

0개의 댓글

관련 채용 정보