1. Thread
쓰레드는 하나의 프로세스에서 작업을 실행하는 주체이자 독립적인 작업 흐름이다.
프로세스는 시스템 상에서 실행중인 하나의 프로그램으로 독립된 메모리 공간을 할당받는다.
프로세스에선 하나의 쓰레드만 사용될 수도, 여러 개의 쓰레드가 사용될 수도 있다.(멀티 쓰레딩 지원)
안드로이드에서 thread는 Main thread(UI thread)와 Background thread로 나눠지는데 메인 쓰레드는 1개만 존재하고, 백그라운드 쓰레드는 여러 개 존재할 수 있다.
Main Thread
Background Thread
- 백그라운드 쓰레드는 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
Handler
핸들러 생성
꼭 워커 쓰레드 외부에서 생성해야함, 쓰레드 내부에서 생성하면 작동 안됨.
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
Handler에서 메세지 전달을 위한 대표적인 두 함수
Handler.sendMessage(Message msg)
Message 객체를 message queue에 전달하는 함수
Handler.sendEmptyMessage(int what)
Message의 what 필드를 전달하는 함수
Splash Theme
Splash Screen : 일반적으로 앱이 실행될 때 나타나는 화면
(ex. 플로 앱 실행시 잠깐 나타나는 로고 화면)
스플래시 스크린을 구현하는 방법은 두 가지가 있는데,
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)