Android - 스레드

유의선·2023년 7월 20일
0

안드로이드에서는 표준 자바의 스레드를 그대로 사용할 수 있다.

일반적으로 Thread 클래스를 상속한 새로운 클래스를 정의한 후 객체를 만들어 시작하는 방법을 사용한다.


activity_main.xml 레이아웃에 버튼을 하나 추가했다.


MainActivity.java에 코드를 작성하였다.

public class MainActivity extends AppCompatActivity {
    int value = 0;

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BackgroundThread thread = new BackgroundThread();
                thread.start();
            }
        });
    }

    class BackgroundThread extends Thread {
        public void run() {
            for(int i = 0; i < 100; i++) {
                try{
                    Thread.sleep(1000);
                } catch (Exception e){}

                value += 1;
                Log.d("Thread", "value : " + value);
            }
        }
    }
}

1초마다 value 값을 1씩 증가시키며 로그로 value값을 출력하는 스레드를 만들어,
버튼을 누르면 실행되게 만들었다.


이번에는 코드를 수정하여 value 값을 TextView에 나타나도록 해보았다.

public class MainActivity extends AppCompatActivity {
    int value = 0;
    TextView textView;

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

        textView = findViewById(R.id.textView);

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BackgroundThread thread = new BackgroundThread();
                thread.start();
            }
        });
    }

    class BackgroundThread extends Thread {
        public void run() {
            for(int i = 0; i < 100; i++) {
                try{
                    Thread.sleep(1000);
                } catch (Exception e){}

                value += 1;
                Log.d("Thread", "value : " + value);
                textView.setText("value : " + value);
            }
        }
    }
}

앱이 실행되지 못하고 에러가 발생한다.

메인 스레드에서 관리하는 UI 객체에는 직접 만든 스레드 객체에서는 접근할 수 없기 때문이다.

이 문제를 해결하기 위해서는 핸들러를 사용해아 한다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기