안드로이드에서는 표준 자바의 스레드를 그대로 사용할 수 있다.
일반적으로 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 객체에는 직접 만든 스레드 객체에서는 접근할 수 없기 때문이다.
이 문제를 해결하기 위해서는 핸들러를 사용해아 한다.
잘 봤습니다. 좋은 글 감사합니다.