티스토리 뷰

반응형

일정 작업을 반복해서 처리해야 될 때가 있습니다.

Handler를 사용하면 편하게 처리할 수 있습니다.

 

 

Handler 사용하기

 

class MainActivity : AppCompatActivity() {

    var handler: Handler? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        handler = Handler()

        handler?.post(Thread2())
    }

    inner class Thread2 : Thread() {
        override fun run() {
            
            textView.text = "${System.currentTimeMillis()}"
        }
    }
}

 

전체적인 사용법은 위와 같습니다.

 

Handler를 가지고 있는 handler 변수에 null을 넣어주고

 

handler에 Handler()를 넣은 후에 post를 통해 Thread class를 넣어줍니다.

 

Handler에서 Thread class에 while문처럼 반복하는 코드를 작성하면 안 됩니다.

만약 반복 작업을 해주고 싶으면 아래와 같이 작성하면 됩니다.

 

inner class Thread2 : Thread() {
    override fun run() {

        textView.text = "${System.currentTimeMillis()}"

        handler?.post(this)
    }
}

 

handler?. post(this)를 통해 자기 자신을 한번 더 실행함으로써 계속 반복 작업을 하게 됩니다.

 

만약 딜레이가 있는 작업을 만들고 싶을 때는 아래와 같이 사용하면 됩니다.

handler?.postDelayed(Thread2(), 1000)

 

post 대신에 postDelayed를 사용하여 딜레이 시간을 주면 됩니다.

 

 

 

Handler를 사용하여 Thread 안에서 Ui 처리하기

handler를 사용하면 개발자가 직접 작성한 Thread class에서 Ui 처리를 할 수 있습니다.

 

 

class MainActivity : AppCompatActivity() {

    var isRunning = false

    var displayHandler: DisplayHandler? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        displayHandler = DisplayHandler()

        isRunning = true
        Thread1().start()
    }

    inner class Thread1 : Thread() {
        override fun run() {

            while (isRunning) {

                Thread.sleep(1000)

                displayHandler?.sendEmptyMessage(0)
            }
        }
    }
    
    inner class DisplayHandler : Handler() {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)

            textView.text = "${System.currentTimeMillis()}"
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        isRunning = false
    }
}

Thread 사용법은 동일합니다.

다른점은 DisplayHandler Class가 추가되었다는 것입니다.

 

Thread에서는 Ui처리가 되지 않기 때문에 Ui처리는 DisplayHandler로 넘긴 것입니다.

 

sendEmptyMessage안에 넣은 파라미터 값으로 전송한 메시지를 구별할 수 있습니다.

 

 

실행하면 아래와 같이 동작합니다.

 

반응형
댓글