[안드로이드 | Android] 쓰레드 Thread
■ 안드로이드 쓰레드
- 쓰레드는 여러 처리를 비 동기적으로 처리하기 위해 사용한다. (동시에 여러 처리를 하기 위한 방법이 쓰레드다.)
- 안드로이드는 비 동기적 처리 외에 네트워크에 관련된 코드는 전부 쓰레드로 운영해야 한다.
■ ANR
- 안드로이드는 Activity의 코드를 처리하기 위해 쓰래드를 발생한다. 여기서 발생되는 쓰래드를 Main Thread라고 부르며 UI Thread라고 부르기도 한다.
- Main Thread가 현재 작업을 하지 않을 때만 화면 작업이 가능하며 Main Thread가 바쁠 때 화면 작업이나 터치가 발생하면 ANR(Application Not Respond)가 발생한다.
■ 화면 처리
- 안드로이드는 개발자가 발생 시킨 쓰래드에서 화면에 대한 처리를 하면 오류가 발생한다. 이 때문에 쓰래드 운영에 대한 처리를 학습해야 한다.
- 현재 안드로이드 오레오(8.0)이상 부터는 개발자가 발생시킨 쓰래드에서 화면 처리가 가능하다.
8.0 미만의 안드로이드 에뮬레이터에서
Main Thread가 무한 루프를 갖고 화면을 변경하도록 하여 ANR이 발생되도록 해본다.
프로젝트를 생성한다.
activity_main.xml 소스코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp" />
</LinearLayout>
MainThread에서 While 무한 루프로 textView의 텍스트를 변경한다.
실행 -> ANR이 발생한 것을 볼 수 있다.
안드로이드 에뮬레이터(가상 안드로이드 디바이스)는 7.1.1 버전 이하 버전으로 쓰래드(개발자가 발생 시킨 쓰래드, Main Thread 또는 UI Thread)의 화면 처리에서 에러가 나타난 것을 확인할 수 있었다.
안드로이드에선 7.1.1 이하의 버전에서 쓰래드를 사용하여 화면을 처리할 수 있는 해결 방법이 제공된다.
핸들러(handler)라는 것인데 여기서는 Thread에 대한 내용을 다루고 다음 글에서 다루기로 한다.
■ 쓰래드를 사용하여 여러 처리를 할 수 있다.
다음 실습 코드에서는 로그를 계속 찍는 일을 쓰래드에서 하게 한다.
activity_main.xml 소스코드
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp" />
</LinearLayout>
MainActivity.java
package com.example.androidthread;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
boolean isRunning;
int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
isRunning = true;
i = 0;
ThreadClass threadClass = new ThreadClass();
threadClass.start();
}
// 쓰래드 클래스
class ThreadClass extends Thread {
@Override
public void run() {
// super.run();
while(isRunning) {
SystemClock.sleep(100);
Log.d("test", "쓰래드 :"+ i++);
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
isRunning = false;
}
}
액티비티는 존재하고, 로그는 쓰래드에 의해서 계속 찍히는 것을 확인할 수 있다.
이처럼 긴 시간 작업할 것을 쓰래드에게 위임하여 작업하게 할 때,
비 동기적으로 다른 여러 처리를 할 때 쓰래드를 사용할 수 있다.
■ 안드로이드 쓰래드 (Android Thread) 정리
- 쓰래드는 비 동기적 처리를 위해 사용하는 요소이다.
- 안드로이드는 Activity의 코드를 처리하기 위해 발생된 Main Thread 에서만 화면 처리가 가능하다.
- 안드로이드 오레오 버전 이상 부터는 개발자가 발생 시킨 쓰래드에서도 화면 처리가 가능하다.