티스토리 뷰
스레드는 작업의 흐름을 말합니다.
앱을 실행하면, Launcher Activity가 실행되며, 이후로는 정해진 작업이 흐르게 됩니다.
안드로이드는 기본적으로 메인 스레드를 지니고 있습니다.
메인 스레드는 Launcher Activity에 따라 정해진 액티비티를 실행하고, 이후에 해야 할 태스크가 있다면, 해당 작업을 순서에 따라 수행하게 됩니다.
메인 스레드 외에 다른 쓰레드가 있다면, 여러 일을 한꺼번에 수행이 가능합니다. '멀티스레딩'이라는 용어가 여기서 등장하는 이유입니다.
안드로이드에 있는 기본적인 메인 스레드의 특징은 다음과 같습니다.
1. UI 스레드로 사용자의 인풋을 받게 되는 스레드입니다.
2. 구글 정책상 사용자의 인풋은 도중에 멈추는 것이 불가능하기 때문에 메인 스레드가 도중에 멈출 수 없습니다. 멈춘다는 것은, 곧 앱을 종료하는 것과 같습니다.
그럼 스레드를 직접 코딩해보도록 합니다.
다음의 코틀린 파일 확인합니다.
class ThreadActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.practice_thread)
val runnable: Runnable = object : Runnable {
override fun run() {
Log.d("Thread", "Thread 실행")
}
}
val thread: Thread = Thread(runnable)
thread.start()
}
}
해당 파일에서 보다시피, runnable에 실행할 동작을 담아서 스레드에 전달하는 방식입니다. 그러므로 Runnable을 먼저 만들고 이후에 스레드를 만들어주면 됩니다.
Runnable과 Thread 모두 AppCompatActivity의 자식이기 때문에, 바로 메소드로 가져와 쓸 수 있습니다.
val runnable: Runnable = object : Runnable 해당 부분은 러너블 변수를 Runnable 타입으로 생성하는데, 변수에 담길 내용은 러너블의 인터페이스 구현체가 들어가게 됩니다. object : Runnable을 보면, 러너블의 인터페이스 구현체가 전달되는데, override fun run ( )에서 보는 바와 같이, 러너블의 run 메소드를 구현해주게 됩니다. 이때, 로그로 전달 내용을 적어준 것 뿐입니다.
이후에 스레드를 생성하고, Thread(runnable) 메소드에 만들어준 러너블을 넣어준 것입니다.
thread.start( ) 처럼, start 메소드를 해줘야만 스레드가 시작된다는 점을 잊지마세요.
이번에는 뷰와 연동시켜서 스레드를 만들어봅니다.
다음으로는 레이아웃에 xml 파일을 준비합니다.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button"
android:text="버튼"
android:layout_width="100dp"
android:layout_height="100dp"/>
</LinearLayout>
이후에 다음의 코틀린 파일을 확인합니다.
class ThreadActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.practice_thread)
val runnable: Runnable = object : Runnable {
override fun run() {
Log.d("Thread", "Thread 실행")
}
}
val thread: Thread = Thread(runnable)
button.setOnClickListener {
thread.start()
}
//람다식이 아닌 경우
Thread(object : Runnable {
override fun run() {
Log.d("Thread2", "Thread2 실행")
}
}).start()
//람다식
Thread(Runnable {
Thread.sleep(2000)
Log.d("Thread3", "Thread3 실행")
runOnUiThread {
button.setBackgroundColor(getColor(R.color.textView_color))
}
}).start()
}
}
첫 번째 스레드인 Thread1은 앱 실행시 바로 스레드가 작동되는 경우입니다.
이후로 xml에 작성한 버튼을 누르는 경우, 스레드가 시작하도록 할 수 있습니다. 아래와 같이 말이죠.
button.setOnClickListener {
thread.start()
}
다음의 코드를 보면, 스레드에 러너블을 인자로 넣고 러너블에서 구현된 run 메소드를 실행시키도록 한 코드입니다.
//람다식이 아닌 경우
Thread(object : Runnable {
override fun run() {
Log.d("Thread2", "Thread2 실행")
}
}).start()
람다식으로 작성된 코드를 봅니다. Thread.sleep( ) 메소드는 스레드가 일정 시간 지난 후에 실행되도록 하는 메소드입니다. 1000분의 1로 계산되어, 2000을 넣으면 2초 뒤에 스레드가 실행되도록 설정한 것입니다.
runOnUiThread는 사용자 유저의 인풋을 반영하도록 도와줍니다. runOnUiThread가 없다면, 기본적인 메인 스레드는 사용자 인풋에 관여할 수 없습니다. 2초 뒤에 버튼의 색상을 바꾸는 부분은 안드로이드 UI적인 부분으로 메인 스레드에서는 관여가 불가능하지만, runOnUiThread 내에서는 해당 작업이 실행됩니다.
//람다식
Thread(Runnable {
Thread.sleep(2000)
Log.d("Thread3", "Thread3 실행")
runOnUiThread {
button.setBackgroundColor(getColor(R.color.textView_color))
}
}).start()
그럼 스레드에한 설명은 여기서 마치겠습니다.
'Android App Coding' 카테고리의 다른 글
애드뷰 Addview (0) | 2021.07.09 |
---|---|
라이브러리 사용하기 Library (0) | 2021.07.09 |
컨텍스트 Context (0) | 2021.07.09 |
리소스 값 Resource Values (0) | 2021.07.09 |
액티비티 <-> 프래그먼트 데이터 전달하기 (0) | 2021.07.08 |
- Total
- Today
- Yesterday
- android adapter
- 리스트뷰
- 안드로이드 프로젝트
- 탭레이아웃
- 자바스크립트 배열
- notifyDataSetChanged
- findViewById
- Bmi Calculator
- lazy init
- 미제사건
- RecyclerView
- 2021년 사건사고
- 2007년 사건사고
- 인텐트
- 안드로이드 스튜디오 에러
- 메소드 오버라이딩
- ToDo List 앱 만들기
- 애드뷰
- 대한민국 미제사건
- 2019년 사건사고
- 안드로이드 앱 만들기
- 리사이클러뷰
- 안드로이드 어댑터
- addView
- tabLayout
- bmi 계산기 만들기
- 뷰 바인딩
- 선형 레이아웃
- view binding
- 상대적 레이아웃
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |