안드로이드 프로그래밍_스레드 실행하기_예제 포함
자동으로 생성되는 메인 액티비티는 하나의 프로세스에서 처리됩니다.
따라서 메인 액티비티의 버튼 클릭 이벤트를 처리하는 일 등 액티비티 내에서 처리하는 기능들은 다 같은 프로세스 안에서 실행되죠.
이렇게 같은 프로세스 안에서 여러 기능들이 순서대로 실행할 수 있습니다.
하지만 일련의 기능이라 해도 대기 시간이 길어지는 네트워크 요청 등의 기능을 수행할 때는 문제가 생길 수 있습니다.
그래서 하나의 프로세스 안에서 여러 개의 작업이 동시 수행되는 멀티 스레드 방식을 사용할 수 있습니다.
이런 멀티 스레드 방식은 같은 프로세스 안에 있으면서 메모리 리소스를 공유하므로 효율적인 처리가 가능합니다.
스레드(Thread)는 동시 수행이 가능한 작업 단위입니다. 현재 수행 중인 작업 이외의 기능을 동시에 처리할 때 새로운 스레드를 만들어 처리합니다. '메인 스레드'는 안드로이드에서 UI 처리할 때 사용되는 기본 스레드입니다. 즉 메인 스레드에서만 UI를 처리할 수 있습니다. 우리가 따로 만든 스레드에서는 UI를 접근, 처리하지 못합니다. 그럼 어떻게 위의 문제점을 어떻게 해결할 수 있을까요?
핸들러를 사용하면 됩니다.
서브 스레드에서 핸들러를 이용하여 UI에 처리하는 방법을 바로 확인하실려면 아래 글을 참고해주세요.
https://bite-sized-learning.tistory.com/142
이 글에서는 스레드 실행시키기만 할 것입니다.
예제를 바로 보실까요?
일단 화면을 만들어줍니다. 가운데 버튼을 클릭했을 때 스레드가 실행됩니다.
■ xml 파일
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="스레드 시작하기 "
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
■ Java 파일
package com.example.samplethread;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
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.btnStart);
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);
}
}
}
}
앱을 실행하고 로그 창을 확인해보세요. value 변수의 값은 스레드에 의해 1초마다 증가한 값이 출력되는 것을 볼 수 있습니다. 이러한 기능을 수행하는 스레드를 BackgroundThread라는 이름으로 정의했으며 이 스레드는 Thread 클래스를 상속받고 있습니다. 스레드 클래스를 정의했다면 그 클래스로부터 스레드 객체를 만들 수 있으며, start() 메서드를 호출하면 스레드가 시작합니다.
오늘 이렇게 간단한 예제를 통해서 서비스를 실행시켜봤고, 다음 글에서는 핸들러로 메시지를 전송해보겠습니다.
핸들러를 이용하면 우리가 직접 만든 스레드 객체에서 UI객체에 접근할 수 있습니다.
'컴퓨터 공학 > Android' 카테고리의 다른 글
[안드로이드 스튜디오] Android 런처 앱 아이콘 변경하기 (3743) | 2020.04.21 |
---|---|
[ 안드로이드 프로그래밍 ] 핸들러로 메시지 전송하기 ( 예제 포함 ) (2399) | 2020.04.08 |
[ 안드로이드 프로그래밍 ] 토스트 메시지 위치 변경하기 (1452) | 2020.04.08 |
[ 안드로이드 프로그래밍 ] 간단한 예제로 서비스 이해하기2 (서비스에서 액티비티로 데이터 전달) (1953) | 2020.04.07 |
[ 안드로이드 프로그래밍] 간단한 예제로 서비스 이해하기1 (액티비티에서 서비스로 데이터 전달) (1066) | 2020.04.06 |
댓글