728x90
Android Thread에 대해서 알아보자.
일반적으로 Thread는 메인 스레드와 백그라운드 스레드로 나누어진다.
메인 스레드
앱이 처음 시작되면 시스템이 스레드 하나를 생성하는데 이를 메인 스레드라고 한다. 메인 스레드의 역할은 크게 두 가지로 액티비티의 모든 생명 주기 관련 콜백을 실행을 담당하거나, 버튼, 에디트텍스트와 같은 UI 위젯을 사용한 사용자의 이벤트와 UI드로잉 이벤트를 담당한다. 그렇기 때문에 UI 스레드라과 불린다.
백그라운드 스레드
작업량이 큰 연산이나, 네트워크 통신, 데이터베이스 쿼리 등은 처리에 긴 시간이 걸린다. 이 모든 작업을 메인 스레드의 큐에 넣고 작업하면 한 작업이 처리가 완료될 때까지 다른 작업을 처리하지 못하는 현상이 발생한다. 이러한 현상을 피하기 위해서 백그라운드 스레드를 이용하여 처리한다.
runOnUiThread()
public final void runOnUiTread(Runnable action) {
if(Tread.currentTread() != mUiThread){ // 메인 스레드가 아니면 액션을 메인 스레드에 전달
mHadler.post(action);
} else { // 메인 스레드이면 스레드 생성
action.run()
}
}
안드로이드 runOnUiThread는 Activity 클래스에서 제공되는 메소드이다. Android developer에서는 Runnable 객체를 메인 스레드에서 실행하도록 만드는 메소드로 현재 스레드가 메인 스레드이면 Runnable 객체의 run() 메소드를 직접 실행 을 하고 아니라면 Handler에게 post() 메소드를 통하여 메인 스레드로 이벤트 큐를 발송한다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Other Thread
val mThread = Thread { // 익명 객체 구현
// 여기서 UI 작업을 수행하면 Exception 발생
runOnUiThread {
// UI 작업 가능.
// UI 스레드가 아니라면 내부적으로 handler.post() 호출
}
}
mThread.start()
}
}
- 백그라운 스레드 → UI 스레드 → UI 자원
- 백그라운드에서 UI 자원을 사용하려면 메인 스레드에 UI 자원 사용 메세지를 전달해야 한다.
- 아래는 timer를 사용한 예시이다.
timer = timer(initialDelay = 0, period = 100) {
currentDeciSecond += 1
val minutes = currentDeciSecond.div(10) / 60
val seconds = currentDeciSecond.div(10) % 60
val deciSeconds = currentDeciSecond % 10
runOnUiThread {
binding.timeTextView.text = String.format("%02d:%02d", minutes, seconds)
binding.tickTextView.text = deciSeconds.toString()
binding.countdownGroup.isVisible = false
}
}
- 뷰에 접근하기 위해서는 메인 스레드(UI 스레드)인 runOnUiThread()를 사용해야 한다.
참고
728x90
'Android > Study' 카테고리의 다른 글
[Android] A RecyclerView with multiple item types in Kotlin에 대해서 공부하자 (0) | 2024.06.09 |
---|---|
[Android] SharedPreferences & 자동 로그인 구현 (0) | 2024.06.01 |
[Android] onNewIntent()에 대해서 알아보자. (0) | 2024.04.20 |
[Android] OkHttp에 대해서 공부해보자. (feat. Refrofit) (0) | 2024.04.20 |
[Android] JUnit4으로 테스트 코드 작성하기 (0) | 2024.03.12 |