[Android] UMC Study - 4주차

Sio·2021년 10월 27일
0

[Android] UMC Study

목록 보기
3/5

1. Thread

쓰레드는 하나의 프로세스에서 작업을 실행하는 주체이자 독립적인 작업 흐름이다.
프로세스는 시스템 상에서 실행중인 하나의 프로그램으로 독립된 메모리 공간을 할당받는다.
프로세스에선 하나의 쓰레드만 사용될 수도, 여러 개의 쓰레드가 사용될 수도 있다.(멀티 쓰레딩 지원)

안드로이드에서 thread는 Main thread(UI thread)Background thread로 나눠지는데 메인 쓰레드는 1개만 존재하고, 백그라운드 쓰레드는 여러 개 존재할 수 있다.

Main Thread

  • 화면의 UI를 그리는 처리를 담당
  • 안드로이드 UI의 구성요소(컴포넌트 등)와 상호작용 하고, UI 이벤트를 사용자에게 응답
  • UI 이벤트 및 작업에 대해 수 초 내에 응답하지 않으면 안드로이드 시스템은 ANR(응용 프로그램이 응답하지 않음) 팝업창을 표시

Background Thread

  • 종료 시간을 미리 계산할 수 없는 작업의 처리가 권장된다. (네트워크 작업 및 파일 다운로드 등 시간이 오래걸리는 작업 포함)
  • Thread를 상속받거나 Runnable 인터페이스를 구현하여 생성할 수 있다.
    (Runnable 인터페이스 : 상속 관계에 있는 클래스도 구현할 수 있도록 지원하는 모델, 코틀린은 다중 상속 허용 X)
  • 백그라운드 쓰레드는 UI요소에 직접 접근이 안된다. 백그라운드 쓰레드와 메인 쓰레드를 연결해 주는 것이 handler이다.

Thread
기본적인 쓰레드 생성 방법

class ThreadTest : Thread() {
	override fun run() {
    	var i = 0
        
        while (i<10) { 
        	i += 1
            Log.i("ThreadTest", "i=${i}")
        }
    }
}

Runnable Thread
위처럼 Thread()를 상속받으면 다른 클래스를 상속받을 수 없기 때문에, Runnable을 상속 받는다. (일반적으로 많이 씀)

class RunnableTest : Runnable() {
	override fun run() {
    	var i = 0
        
        while (i<10) { 
        	i += 1
            Log.i("RunnableTest", "i=${i}")
        }
    }
}

runOnUiThread로 UI에 접근

runOnUiThread를 이용해서 간단하게 UI에 접근 가능

class UiTest : Thread() {
	override fun run() {
    	var i = 0
        
        while (i<10) { 
        	i += 1
            
            runOnUiThread {
            	textView.text = "count : ${i}"
            }
            Thread.sleep(1000) // 1초
        }
    }
}

Looper

  • Message Queue에서 메세지, Runnable 객체를 차례로 꺼내서 핸들러가 처리하도록 전달한다.
  • MainActivity가 실행됨과 동시에 자동으로 무한루프를 돌고 있는 서브 쓰레드라고 생각할 수 있다.
  • 이 무한루프는 대기하고 있다가 자신의 Queue에 쌓인 메세지를 핸들러에게 전달한다.

Handler

  • 루퍼로부터 받은 메시지, Runnable 객체를 처리하거나 메세지를 받아서 Message Queue에 넣는 쓰레드간의 통신장치이다.
  • 자동으로 생성되어 무한루프를 도는 루퍼와 달리 핸들러는 개발자가 직접 생성해서 사용해야 한다.

핸들러 생성

꼭 워커 쓰레드 외부에서 생성해야함, 쓰레드 내부에서 생성하면 작동 안됨.

private val handler = Handler(Looper.getMainLooper())

runOnUiThread 대신 handler를 통해 UI에 접근하는 방법

Handler.post(new Runnable())
Runnable 객체를 message Queue에 전달하는 함수

class UiTest : Thread() {
	override fun run() {
    	var i = 0
        
        while (i<10) { 
        	i += 1
            
            handler.post {
            	textView.text = "count : ${i}"
            }
            Thread.sleep(1000) // 1초
        }
    }
}

Message

  • 루퍼의 Queue에 값을 전달하기 위해 사용되는 클래스로, Message 객체에 미리 정해둔 코드를 입력하고, 큐에 담아두면 루퍼가 핸들러에게 전달한다.

Handler에서 메세지 전달을 위한 대표적인 두 함수

Handler.sendMessage(Message msg)
Message 객체를 message queue에 전달하는 함수

Handler.sendEmptyMessage(int what)
Message의 what 필드를 전달하는 함수

Splash Theme

Splash Screen : 일반적으로 앱이 실행될 때 나타나는 화면
(ex. 플로 앱 실행시 잠깐 나타나는 로고 화면)

스플래시 스크린을 구현하는 방법은 두 가지가 있는데,

  1. Splash Activity로 구현

splash가 뜨는 시간을 강제로 고정할 수 있음. 개발자가 구현한 가짜 스플래시 화면을 보고 메인 화면으로 진입하게 되는 비효율 적인 동작을 하게 됨.

2. Splash Theme로 구현

drawable에 splash.xml 추가

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@android:color/background_dark" />
  <item>
    <bitmap
      android:src="@drawable/ic_launcher"
      android:gravity="center"/>
  </item>
</layer-list>

@android:color/background_dark : splash 배경 색상 혹은 이미지
@bitmap/ic_launcher : 로고 이미지

values/styles.xml에 SplashTheme 추가

  <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash</item>
  </style>

AndroidManifest.xml에서 MainActivity에 SplashTheme 적용

    <activity
      android:name=".MainActivity"
      android:theme="@style/SplashTheme">

MainActivity의 onCreate 함수에서 setTheme()를 이용하여 기존 테마로 되돌리기

override fun onCreate(savedInstanceState: Bundle?) {
    setTheme(R.style.AppTheme)
profile
나는 시오

0개의 댓글

관련 채용 정보