스레드(Thread)란 무엇인가?
예제를 살펴보기 전에 스레드의 개념부터 간단히 짚고 넘어가겠습니다. 스레드는 경량화된 하위 프로세스로, UI를 방해하지 않으면서 백그라운드 작업을 수행하는 역할을 합니다. 안드로이드 앱에서 네트워크 통신, 파일 처리, 데이터 연산 등 시간이 오래 걸리는 작업을 메인 스레드와 분리해서 실행할 때 필수적인 요소입니다.
이번 예제에서는 자바의 Thread 클래스가 제공하는 getName()과 setName() 메서드를 안드로이드에서 어떻게 활용하는지 알아보겠습니다. setName()은 스레드에 이름을 지정하고, getName()은 지정된 이름을 가져오는 데 사용됩니다.
Step 1 — 새 프로젝트 생성하기
Android Studio를 열고 File ⇒ New Project로 이동한 뒤, 새 프로젝트 생성에 필요한 모든 세부 정보를 입력하여 프로젝트를 만듭니다.
Step 2 — 레이아웃 구성하기
다음 코드를 res/layout/activity_main.xml에 추가합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_marginTop="100dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/edit_query"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter string" />
<Button
android:id="@+id/click"
android:layout_marginTop="50dp"
style="@style/Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored"
android:layout_width="wrap_content"
android:background="#c1c1c1"
android:textColor="#FFF"
android:layout_height="wrap_content"
android:text="Button" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>위 레이아웃에는 EditText(텍스트 입력창), Button, TextView 세 가지 요소가 배치되어 있습니다. 사용자가 EditText에 문자열을 입력하면, 버튼 클릭 시 스레드가 해당 문자열을 받아 500ms 동안 대기한 후 스레드 이름을 TextView에 표시하는 구조입니다.
Step 3 — MainActivity 작성하기
다음 코드를 src/MainActivity.java에 추가합니다.
package com.example.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
EditText edit_query;
TextView textView;
boolean twice = false;
Thread t = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit_query = findViewById(R.id.edit_query);
textView = findViewById(R.id.text);
findViewById(R.id.click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runthread();
}
});
}
private void runthread() {
twice = true;
if (twice) {
final String s1 = edit_query.getText().toString();
t = new Thread(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(t.getName());
try {
Thread.sleep(500);
twice = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
});
t.start();
t.setName(s1);
}
}
}코드 핵심 로직 설명
버튼이 클릭되면 runthread() 메서드가 호출되어 새로운 스레드 객체를 생성하고 t.start()로 스레드를 실행시킵니다. 이후 t.setName(s1)을 통해 사용자가 입력한 문자열을 스레드의 이름으로 설정합니다. 스레드 내부에서는 runOnUiThread()를 사용해 메인(UI) 스레드에서 t.getName()으로 스레드 이름을 가져와 TextView에 표시합니다.
여기서 주목할 점은 UI 요소를 직접 수정할 수 없는 백그라운드 스레드 특성 때문에 runOnUiThread()를 사용했다는 것입니다. 이는 안드로이드의 기본 규칙으로, 화면 갱신 작업은 반드시 메인 스레드에서 수행해야 합니다.
앱 실행 및 결과 확인
이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭하고, 목록에서 본인의 모바일 기기를 선택하세요. 그러면 기기에 기본 화면이 표시됩니다.
실행 결과에서 EditText에 원하는 텍스트를 입력하고 버튼을 누르면, 입력한 데이터가 스레드 이름으로 설정(setName)되고, getName() 메서드를 통해 그 값을 다시 가져와 TextView에 출력되는 것을 확인할 수 있습니다.