[안드로이드/Thread] Thread 란?

2023. 4. 16. 03:01· Android
목차
  1. Android Thread
반응형

Android Thread

  • 소프트웨어 관점에서 스레드는 하나의 프로그램에서 여러개의 실행 단위/흐름이 존재함을 의미 (*프로세스는 실행 중인 '프로그램')
  • 여러 처리를 비동기적으로 처리하기 위해 사용 -> 어떤 작업이 수행중임에도 다른 작업이 동시에 수행됨. 한 작업이 종료된 후 두 작업 사이에 맞춰야할 것이 있다면 그때 추가 작업 수행 (순차적 처리 X, 동시 처리 O)
  • 안드로이드는 비동기적 처리 외에도 네트워크 관련된 코드는 전부 Thread로 운영해야 함 (주로 하위 버전에서)
  • Activity의 코드 처리 위해 Thread 발생 (안드로이드 OS가 발생시킴) -> Main Thread / UI Thread (이 안에서 화면 갱신 가능)
  • 하나의 스레드 안에서는 동기적으로 처리(순차적 처리)하기 때문에 Main Thread가 현재 작업하고 있지 않을때만 화면 작업 가능
  • 오래 걸리는 작업은 별도의 Thread를 발생시켜 처리해서 Main Thread는 유휴 상태를 유지해 언제든지 화면 갱신 가능하도록 해주는 것이 중요!! * 화면상 그리기, 터치 등 모두 main thread 에서 작업
화면에 관련된 작업이나 터치 처리는 UI Thread 에서만 처리가 가능 (3~5초 안에 바로바로 나와야 함)
Main Thread 에 수행할 코드가 많아 바쁘다면 화면 작업이나 터치 처리를 할 수 없음
오래 걸리는 작업은 별도의 Thread 로 운영을 해야 함
  • 별도의 Thread 에서의 작업 상태를 중간중간 화면 처리로 보여줘야 하는 경우, 개발자가 발생시킨 스레드(별도 작업)에서 화면에 관련된 처리를 할 경우 오류남 (즉, main thread 에서 화면 처리 할 수 있도록 스레드 운영 방법 학습이 중요)
  • 안드 O (8.0) 이상부터 개발자가 발생시킨 스레드에서 화면 처리 가능 -> 버전별 처리가 중요 
var isRunning = false

// Activity가 생성될 때 자동으로 호출
// 화면 전환(가로,세로) 발생시 자동으로 호출되면서 새로운 화면 구현
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
    val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
    setContentView(view)


    // 기본 리스트 다이얼로그 (다이얼로그에 리트스뷰를 넣어 커스텀 한다고 생각하면 됨)
    binding.button.setOnClickListener {
        val now = System.currentTimeMillis() //현재 시각을 밀리세컨드 단위로 출력
        binding.textView.text = "버튼 클릭 : ${now}"

    }
    
    /*
    // 이 작업을 처리하느라 화면이 나타나지 않는 현상 발생  -> 스레드로 빼서 운영 (runnable 인터페이스 구현/스레드 상속 받은 클래스 만들기)
    while (true) {
        SystemClock.sleep(100)
        val now2 = System.currentTimeMillis()
        Log.d("test", "while문 : ${now2}")
    }
     */
    
    // 익명 중첩 클래스로 구현
    isRunning = true
    val thread1 = object : Thread() {
        override fun run() {
            super.run()
            /*액티비티가 종료가 되더라도 이 스레드는 계속 돌아갈 수 있음.
              심지어 이 스레드를 실행시킨 액티비티가 종료되었음으로 이 스레드를 정지할 방법 없음
              -> 변수를 선언해 처리
            */
            while (isRunning) {
                SystemClock.sleep(100)
                val now2 = System.currentTimeMillis()
                Log.d("test", "while문 : ${now2}")
                binding.textView2.text = "thread : ${now2}" // 화면 작업을 개발자가 동작시킨 스레드에서 수행
                // 8.0 이상에서는 잘 동작하지만 하위 버전에서는 오류 나기 때문에 주의 필요
            }
        }
    }
    thread1.start()
    
    /*
    // 코틀린에서는 thread() 라는 고차 함수 지원하기 때문에 바로 작성 가능
    thread { // 바로 스레드 운영(시작) 가능
        while (isRunning) {
            SystemClock.sleep(100)
            val now2 = System.currentTimeMillis()
            Log.d("test", "while문 : ${now2}")

        }
    }
     */
}

override fun onDestroy() {
    super.onDestroy()
    isRunning = false //액티비티가 종료가 될 때 isRunning이 false가 되기 때문에 스레드도 종료될 수 있음
}

안드 8.0 이상 버전 -> 스레드 내부에서 화면 처리 가능한 예시

 

✔️ 복잡한 처리를 위해 Thread 중첩 익명 클래스 or 고차함수로 구현

✔️ 안드 8.0 이상에서는 화면 그리는 처리를 thread 내부에서 처리 가능하지만, 그 이하 버전에서는 오류 남

반응형

'Android' 카테고리의 다른 글

[안드로이드/Thread] Handler를 사용한 화면 처리  (0) 2023.04.17
[안드로이드/Thread] Handler를 사용한 반복작업 처리  (0) 2023.04.16
[안드로이드/메시징] Message Notification  (0) 2023.04.15
[안드로이드/메시징] 다양한 Notification  (0) 2023.04.14
[안드로이드/Error] PendingIntent.FLAG_UPDATE_CURRENT 오류  (0) 2023.04.14
  1. Android Thread
'Android' 카테고리의 다른 글
  • [안드로이드/Thread] Handler를 사용한 화면 처리
  • [안드로이드/Thread] Handler를 사용한 반복작업 처리
  • [안드로이드/메시징] Message Notification
  • [안드로이드/메시징] 다양한 Notification
gangmini
gangmini
gangmini
게으른J 의 테크로그
gangmini
전체
오늘
어제
글쓰기방명록관리자
  • 분류 전체보기 (127)
    • 인공지능(AI) & 데이터 분석 (5)
    • Android (91)
      • Coroutine (3)
      • Compose (0)
      • 안드로이드 CS (0)
    • Kotlin (3)
    • Data Structure (0)
    • 알고리즘 (20)
      • 알고리즘 이론 (11)
      • 백준(BOJ) 문제 풀이 (9)
    • Build Tool (2)
    • Git (2)
    • 일본어 (0)
    • 기타(취준, 활동) (0)


인기 글



최근 댓글



최근 글

hELLO · Designed By 정상우.v4.2.2
gangmini
[안드로이드/Thread] Thread 란?
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.