APP

[안드로이드 | Android] 쓰레드 Thread

isaac.kim 2021. 3. 21.
728x90
반응형

[안드로이드 | 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 에서만 화면 처리가 가능하다.

- 안드로이드 오레오 버전 이상 부터는 개발자가 발생 시킨 쓰래드에서도 화면 처리가 가능하다.

728x90
반응형