반응형
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가 되기 때문에 스레드도 종료될 수 있음
}
✔️ 복잡한 처리를 위해 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 |