일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 안드로이드 레트로핏 crud
- 서비스 쓰레드 차이
- 클래스
- 객체
- rxjava hot observable
- 스택 자바 코드
- android retrofit login
- ar vr 차이
- 안드로이드 라이선스
- Rxjava Observable
- 큐 자바 코드
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- 자바 다형성
- android ar 개발
- 2022 플러터 설치
- 안드로이드 유닛 테스트
- jvm 작동 원리
- 플러터 설치 2022
- ANR이란
- 안드로이드 os 구조
- rxjava cold observable
- 2022 플러터 안드로이드 스튜디오
- rxjava disposable
- 안드로이드 유닛테스트란
- jvm이란
- 안드로이드 유닛 테스트 예시
- 안드로이드 라이선스 종류
- 멤버변수
- 서비스 vs 쓰레드
- Today
- Total
나만을 위한 블로그
[Android] runOnUiThread란? 본문
참고한 사이트 : https://itmining.tistory.com/6
https://recipes4dev.tistory.com/172
오늘은 runOnUiThread()에 대해서 정리하는 글을 쓰려고 한다.
뒤에 ()가 붙은 걸 보면 알겠지만 메서드다.
안드로이드는 싱글 쓰레드 체제이며, 오직 메인 쓰레드(UI 쓰레드)만이 뷰의 값을 바꿀 수 있는 권한을 갖고 있다.
그래서 뷰의 값에 간섭하는 작업을 하는 쓰레드만을 만들고 뷰에 접근하려 시도하면, 안드로이드 자체적으로 앱을 죽여버린다. 이 경우를 막기 위해 안드로이드 개발자들은 핸들러라는 것을 만들어서 쓰도록 했다.
핸들러는 handler.post()로 메시지나 Runnable 객체를 전달하지만 이것 외에도 3가지 방법이 있다.
1. View.post()
2. Android.runOnUiThread()
3. AsyncTask 클래스
이 중 이 글의 주제인 runOnUiThread()는 디벨로퍼에서 이렇게 말하고 있다.
- Runs the specified action on the UI thread. If the current thread is the UI thread, then the action is executed immediately. If the current thread is not the UI thread, the action is posted to the event queue of the UI thread.
- UI 스레드에서 지정된 작업을 실행합니다. 현재 스레드가 UI 스레드이면 작업이 즉시 실행됩니다. 현재 스레드가 UI 스레드가 아닌 경우 조치(action)는 UI 스레드의 이벤트 큐에 게시됩니다.
지금 작업을 수행하는 쓰레드가 메인 쓰레드라면 즉시 작업을 시작하고
메인 쓰레드가 아니라면 쓰레드 이벤트 큐에 쌓아두는 기능을 하는 게 runOnUiThread다.
이 메서드는 액티비티 클래스에서 제공되는 메서드다. 개발자가 만든 Runnable 객체를 메인 쓰레드에서 실행되게 하는 메서드인데, 현재 메서드가 메인 쓰레드인지 여부를 검사해 메인 쓰레드가 아니라면 post()를 실행하고, 맞다면 Runnable의 run()을 실행한다.
그럼 구조는 어떻게 되어 있을까?
Thread.currentThread()로 현재 쓰레드가 메인 쓰레드인지 확인하고 맞으면 바로 action(Runnable)을 run()하며 아니라면 핸들러의 post()로 Runnable 객체를 넘긴다. 이 때 넘겨진 Runnable 객체는 이벤트 큐에 쌓여서 번호표를 뽑고 자기 순서가 올 때까지 기다리는 은행 방문객처럼 된다.
예제는 2번 사이트의 예제를 가져왔다. 디지털 시계를 구현한 예제다.
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="48sp"
android:text="00:00:00"
android:id="@+id/clock"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
예제를 빌드하면 현재 시각이 1초마다 갱신된다.
코드 자체는 매우 쉬워서 주석만 봐도 이해되므로 분석은 생략했다.
'Android' 카테고리의 다른 글
[Android] 스피너란? (0) | 2019.12.01 |
---|---|
[Android] ArrayAdapter란? (0) | 2019.12.01 |
[Android] AsyncTask란? (0) | 2019.11.28 |
[Android] Cannot open a library at FileMapping 에러 (0) | 2019.11.26 |
[Android] 태그란? (0) | 2019.11.25 |