일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- constraintlayout
- MVI
- Mocky
- Swiftshader
- TabLayout
- ViewPager2
- LinearLayout
- systembar
- Android13
- 안드로이드
- repositories
- Kotlin
- mvvm
- Emulator fails to Launch
- compose
- Android
- AndroidStudio
- statusbar
- SharedPreference
- Backup Manager
- CoroutineScope
- ViewModel
- GPT
- php
- retrofit
- github
- sdk33
- ToyProject
- 피그마
- Coroutine
- Today
- Total
Kwaang Tech
[Android] Kotlin으로 안드로이드 스레드(Thread)사용하기 본문
스레드(Thread)
한 개의 프로그램(프로세스)에서는 많은 스레드를 동시에 처리 할 수 있다.
그리고 프로세스의 메모리 또한 공유한다.
프로세스로부터 각 메모리를 할당 받은 스레드는 독립적으로 실행 된다.
안드로이드 역시 1개의 앱(프로그램)에서 여러개의 스레드를 사용할 수 있는데,
예를 들어
음악을 들을 때,
다운로드를 받을 때,
푸쉬 알림 등 이 모두 스레드를 이용한 기능이다.
UI에 접근하기
메인 스레드
엑티비티를 포함해 모든 컴포넌트가 실행되는 오직 1개만 존재하는 스레드
메인 스레드의 제약사항
- 화면의 UI를 그리는 처리를 담당
- UI와 상호 작용하고, 이벤트 결과를 사용자에게 보여줌
- UI 이벤트 등 작업에 일정시간 동안 응압이 없으면 , ANR 팝업 표시 (ANR : 응용 프로그램이 응답하지 않는 것)
즉 사용자가 불편함을 느끼지 않도록 안드로이드는 지속적으로 상호작용을 해야한다. 이러한 제약사항이 없다면, 사용자는 조금이라도 느린 반응에 불편함을 겪을 것이다.
백그라운드 스레드
메인 스레드가 UI 처리 및 사용자와의 상호작용을 한다면, 백그라운드 스레드는 그 나머지를 모두 맡아서 처리한다.
예를 들면, 네트워크 작업 및 파일 다운로드 등 시간이 오래 걸리는 작업을 뜻한다.
안드로이드는 종료 시간을 알 수 없는 작업들에 대해서는 이 백그라운드 스레드에서 처리하길 권장하고 있다.
스레드 실습
Thread
기본적인 스레드 생성 방법
class A : Thread() {
override fun run() {
super.run()
for(i in 1..1000) {
Log.d("test","second: $i")
}
}
}
Runnable Thread
기능상 위의 스레드와의 차이는 없다.
하지만 Thread()를 상속받으면 기타 다른 클래스를 상속받을 수 없다는 단점이 있다. 반면 Runnable을 상속받은 스레드는 다른 클래스도 구현 할 수 있도록 지원하는 모델이다. 그래서 이 Runnable을 상속받은 스레드를 구현하는 일반적이다.
class A : Runnable {
override fun run() {
for(i in 1..1000) {
Log.d("test","second: $i")
}
}
}
코틀린에서의 thread()
코틀린에서는 조금 더 간편하게 Thread()를 사용할 수 있다.
thread()안에 파라미터를 start=true로 전달하면 블럭안의 코드를 실행할 수 있다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
thread(start = true) {
var i = 0
while (i < 10) {
i += 1
Log.d("test", "first: $i")
}
}
}
}
runOnUiThread로 UI에 접근하기
간단하게 Thread.sleep() 함수를 사용해서 초단위로 TextView에 반영
runOnUiThread를 사용해서 간단하게 UI에 접근이 가능
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
thread(start = true) {
var i = 0
while (i < 10) {
i += 1
runOnUiThread{
textView.text = "test : $i"
}
Thread.sleep(1000)
}
}
}
}
사실 runOnUiThread는 간단한 방법이다.
스레드의 결과를 UI에 접근해서 조작하는 방법은 또 다른 것이 있는데,
그건 Looper와 Handler이다.
하지만 이건 다음시간에~
'Dev > Study' 카테고리의 다른 글
[API]Mocky 로 가상 API 만들기 (0) | 2024.02.07 |
---|---|
[Android] CoroutineScope와 launch 함수 (1) | 2023.11.23 |
ViewModel에서 View의 특정타입(Button,ListView 등)을 직접적으로 참조를 하지 않는 이유 (0) | 2023.09.19 |
MVC, MVP, MVVM, MVI (7) | 2023.09.14 |
[Android] ViewPager2 사용법과 TabLayout 적용해보기 (3) | 2023.09.04 |