안드로이드 개발자의 창고
[39일차 Android] Thread, runOnUiThraad 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Thread
- 안드로이드는 Activity의 코드를 처리하기 위해 Thread를 발생 시킨다
- 이 때 발생되는 Thread를 Main Thread라고 부르며 UI Thread라고 부르기도 한다.
- Main Thread가 현재 어떠한 처리도 하지 않고 유휴 상태일때만 화면 작업이 가능하다.
- 이 때문에 오래 걸리는 작업은 별도의 Thread를 발생시켜 처리하고 Main Thread를 항상 유휴 상태로 유지하게 해야 한다.
화면 처리
- 안드로이드는 개발자가 발생 시킨 Thread에서 화면에 대한 처리를 하면 오류가 발생한다.
- 현재 안드로이드 오래오(8.0) 이상 부터는 개발자가 발생 시킨 Thread에서 화면 처리가 가능하다.
- 허나 OS 버전이 변경되면서 상황은 달라질 수도 있고 하위 버전을 위해 화면 처리는 반드시 Main Thread에서 하는 것이 좋다.
runOnUiThraad
- 개발자가 발생시킨 일반 Thread에서 코드 일부를 Main Thread가 처리하도록 하는 메서드
- 이를 이용해 Handler 대신하여 Thread를 운영할 수 있다.
예제 코드
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
button.setOnClickListener {
val now = System.currentTimeMillis()
textView.text = "now : $now"
}
}
// 100 ms 마다 한번씩 현재 시간을 가져와 출력한다.
while(true){
SystemClock.sleep(100)
val now2 = System.currentTimeMillis()
// activityMainBinding.textView2.text = "now2 : $now2"
Log.d("now2", "now2 : $now2")
}
}
}
- 해당 코드는 while문으로 현재 시간을 계속 Logcat에 출력한다.
- 그러나 해당 코드는 onCreate() 내부에서 실행했기 때문에 onCreate()가 끝나지 않아 앱 화면이 나오지 않는다.
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
button.setOnClickListener {
val now = System.currentTimeMillis()
textView.text = "now : $now"
}
}
thread {
while(true){
SystemClock.sleep(100)
val now2 = System.currentTimeMillis()
Log.d("now2", "now2 : $now2")
runOnUiThread {
activityMainBinding.textView2.text = "now2 : $now2"
}
}
}
}
}
- 위의 while문 코드를 보완하기 위해 Thread를 사용하여 구현한 코드이다.
- 사용자가 발생 시킨 Thread 안에서 화면에 관련된 작업이 필요하다면 runOnUiThread를 사용한다.
- runOnUiThread 안에 만들어놓은 코드는 MainThread가 처리하도록 요청한다.
- 그러나 Kotlin 기반으로 안드로이드 애플리케이션을 제작할 경우 runOnUiThread를 사용하는 것을 미리 구현해놨기 때문에 runOnUiThraad를 사용하지 않아도 된다.
'Computer > Android' 카테고리의 다른 글
[39일차 Android] Service (0) | 2023.06.29 |
---|---|
[39일차 Android] Broadcast Receiver (0) | 2023.06.27 |
[38일차 Android] 다양한 Notification (0) | 2023.06.25 |
[38일차 Android] Pending Intent (0) | 2023.06.25 |
[38일차 Android] Notification (0) | 2023.06.25 |