본문 바로가기
App/Android Java

Android_Java(30) - ThreadBasic(2)

by SeleniumBindingProtein 2022. 2. 15.
728x90
반응형

1 다중 스레딩 
    1) 하나의 앱이 동시에 여러가지 작업을 하는 것
    2) 이 작업은 스레드(Thread)라고 불림 

2. 안드로이드에서의 프로세스와 스레드   
    1) 앱이 시작되면 안드로이드 시스템은 새로운 리눅스 프로세스를 생성함 
    2) 기본적으로 앱 안의 모든 컴포넌트들은 동일한 프로세스의 동일한 스레드로 실행됨 
    3) 이 기본적인 스레드를 메인 스레드(main thread)라고 부름 

3. 메인 스레드 
    1) 사용자 인터페이스 위젯에게 이벤트를 전달하거나 화면에 그리는 작업을 담당
    2) = UI 스레드 라고도 불림 

4. 안드로이드의 단일 스레드 모델 원칙
    1) UI 스레드는 블록시키면 안됨 
    2) UI 스레드는 외부에서 안드로이드 UI 툴킷을 조작하면 안됨

5. 작업 스레드
    1) 별도로 생성되는 스레드 
    2) 배경 스레드(Background thread)라고도 함
    3) 스레드에서 직접적으로 UI 위젯을 변경하면 안됨 

6. 작업 스레드를 작성하는 방법
    1) Thread 클래스 상속받아서 스레드 작성 
    2) Runnable 인터페이스 구현한 후에 Thread 객체에 전달하는 방법


<?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="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Progress Bar Thread" />
    <ProgressBar
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal">
    </ProgressBar>

</LinearLayout>

package kr.co.threadbasic;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ProgressBar;

public class MainActivity extends AppCompatActivity {

    private ProgressBar mProgress;
    private int mProgressStatus = 0;
    private Handler mHandler = new Handler();
    int i = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);

        mProgress = findViewById(R.id.progressBar);

        //background thread
        //작업 스레드가 익명 클래스로 정의됨
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(mProgressStatus < 100){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    mProgressStatus = i++;

                    //progressbar를 update
                    //UI를 업데이트하는 Runnable 객체를 전송
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mProgress.setProgress(mProgressStatus);
                        }
                    });
                }
            }
        }).start();
    }
}

[결과 출력]

01

728x90
반응형

'App > Android Java' 카테고리의 다른 글

Android_Java(32) - ImageDownload  (0) 2022.02.15
Android_Java(31) - AsyncTask  (0) 2022.02.15
Android_Java(29) - ThreadBasic  (1) 2022.02.15
Android_Java(28) - AudioPlay  (0) 2022.02.15
Android_Java(27) - SGM  (0) 2022.02.14

댓글