ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 앱 개발 연습 - 11 | Thread (Looper & Handler)
    Archive/캡스톤디자인 2022. 4. 4. 16:23

    Thread

    Thread
    시스템상의 실행 중인 프로그램인 각 프로세스에서 동작하는 독립적인 실행 흐름을 의미

    Main Thread

    Main Activity를 비롯한 모든 컴포넌트가 동작하는 Thread로 아래와 같은 특징과 제약사항이 있다.

    • 화면의 UI를 그리는 처리를 담당
    • 안드로이드 UI 툴킷의 구성 요소와 상호작용하고, UI 이벤트를 사용자에게 응답
    • 작업에 대한 응답이 수 초 내에 이루어지지 않으면 'ANR(Application Not Responding; 응답 없음)' 팝업창이 뜨게 됨

    Background Thread

    메모리 이외의 다른 곳에서 데이터를 가져오는 등의 처리 시간이 걸리는 모든 작업은 Background Thread에서 처리하는 것을 권장한다. 이때 Background Thread의 생성 방법은 아래와 같다.

     

    Thread 객체

    class MyThread: Thread() {
        override fun run() {
            var i = 0
            while (i < 10) {
                i += 1
            }
        }
    }
    class MainActivity : AppCompatActivity() {
        val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            var thread = MyThread()
            thread.start()
        }
    }

     

    Runnable 인터페이스

    class MyThread: Runnable {
        override fun run() {
            var i = 0
            while (i < 10) {
                i += 1
            }
        }
    }
    class MainActivity : AppCompatActivity() {
        val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            var thread = Thread(MyThread())
            thread.start()
        }
    }

     

    Kotlin thread()

    class MainActivity : AppCompatActivity() {
        val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            thread(start = true) {
                var i = 0
                while (i < 10) {
                    i += 1
                }
            }
        }
    }

    Handler & Looper

    Looper
    MainActivity가 실행됨과 동시에 실행되는 일종의 서브 스레드로, 무한루프를 돌고 있는 형태로 동작한다.
    해당 무한루프는 대기하고 있다가 큐에 메시지가 쌓이면 이를 핸들러에 순서대로 전달한다.
    Handler
    Looper가 있는 메인 스레드에서 주로 사용되며, 새로 생성된 스레드들과 메인 스레드와의 통신을 담당한다. Looper를 통해 전달받은 메시지를 받아 처리하는 일종의 처리기 역할을 한다.

    Timer App (예시)

    MainActivity.kt

    class MainActivity : AppCompatActivity() {
        val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
    
            var total = 0
            var isStart = false
    
            val handler = object: Handler(Looper.getMainLooper()) {
                override fun handleMessage(msg: Message) {
                    val minute = String.format("%02d", total / 60)
                    val second = String.format("%02d", total % 60)
                    binding.textTimer.text = "$minute:$second"
                }
            }
    
            binding.btnStart.setOnClickListener {
                if (!isStart) {
                    isStart = true
                    binding.btnStart.text = "PAUSE"
                    thread(start = true) {
                        while (isStart) {
                            Thread.sleep(1000)
                            if (isStart) {
                                total += 1
                                handler?.sendEmptyMessage(0)
                            }
                        }
                    }
                } else {
                    isStart = false
                    binding.btnStart.text = "START"
                }
            }
            binding.btnStop.setOnClickListener {
                isStart = false
                total = 0
                binding.textTimer.text = "00:00"
                binding.btnStart.text = "START"
            }
        }
    }

    댓글