본문 바로가기
컴퓨터 공학/Android

[ 안드로이드 프로그래밍 ] 스레드 실행하기 ( 예제 포함 )

by hahehohoo 2020. 4. 8.
반응형

안드로이드 프로그래밍_스레드 실행하기_예제 포함

 

자동으로 생성되는 메인 액티비티는 하나의 프로세스에서 처리됩니다.

따라서 메인 액티비티의 버튼 클릭 이벤트를 처리하는 일 등  액티비티 내에서 처리하는 기능들은 다 같은 프로세스 안에서 실행되죠. 

 

 

이렇게 같은 프로세스 안에서 여러 기능들이 순서대로 실행할 수 있습니다. 

하지만 일련의 기능이라 해도 대기 시간이 길어지는 네트워크 요청 등의 기능을 수행할 때는 문제가 생길 수 있습니다. 

그래서 하나의 프로세스 안에서 여러 개의 작업이 동시 수행되는 멀티 스레드 방식을 사용할 수 있습니다. 

 

 

이런 멀티 스레드 방식은 같은 프로세스 안에 있으면서 메모리 리소스를 공유하므로 효율적인 처리가 가능합니다.

 

스레드(Thread)는 동시 수행이 가능한 작업 단위입니다. 현재 수행 중인 작업 이외의 기능을 동시에 처리할 때 새로운 스레드를 만들어 처리합니다. '메인 스레드'는 안드로이드에서 UI 처리할 때 사용되는 기본 스레드입니다.  즉 메인 스레드에서만 UI를 처리할 수 있습니다. 우리가 따로 만든 스레드에서는 UI를 접근, 처리하지 못합니다. 그럼 어떻게 위의 문제점을 어떻게 해결할 수 있을까요?

 

핸들러를 사용하면 됩니다. 

서브 스레드에서 핸들러를 이용하여 UI에 처리하는 방법을 바로 확인하실려면 아래 글을 참고해주세요. 

 

 https://bite-sized-learning.tistory.com/142 

 

[ 안드로이드 프로그래밍 ] 핸들러로 메시지 전송하기 (예제 포함)

 

bite-sized-learning.tistory.com

 

 

이 글에서는 스레드 실행시키기만 할 것입니다.

예제를 바로 보실까요?

 

일단 화면을 만들어줍니다. 가운데 버튼을 클릭했을 때 스레드가 실행됩니다.

 

■ 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객체에 접근할 수 있습니다. 

 

 

소문난 명강의 오준석의 플러터 생존 코딩:Flutter와 Dart 입문부터 안드로이드와 iOS용 3가지 앱 개발까지, 한빛미디어이것이 자바다:신용권의 Java 프로그래밍 정복, 한빛미디어Hello Coding 프로그래밍:개념부터 처음 배우는, 한빛미디어처음 배우는 플러터:예제로 배우는 크로스 플랫폼 애플리케이션 개발, 한빛미디어돈 되는 안드로이드 앱 만들기:안드로이드 앱 개발을 위한 기본적이고 필수적인 내용 수록, 영진닷컴

 

 

반응형


댓글