본문 바로가기
안드로이드/Thread

안드로이드 Handler를 통한 화면 처리

by 김어찐 2022. 6. 16.
728x90

안드로이드에서 네트워크에 관련된 처리나 오래 걸리는 작업은 모두 개발자가 발생하는 쓰래드에서 처리해야 한다.
안드로이드 8.0 미만 OS에서는 개발자가 발생하는 쓰래드에서 화면에 관련 처리를 하면 오류가 발생한다.
이 때 Handler를 이용하면 화면 처리가 가능하다.

 

package com.example.handlermessage

import android.os.*
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {

    var isRunning = false

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

        button.setOnClickListener {
            val now = System.currentTimeMillis()
            textView.text = "버튼 클릭 : $now"
        }

        // 화면 처리를 위한 핸들러
        val handler1 = object : Handler(Looper.myLooper()!!) {
            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)

                when (msg.what) {
                    0 -> {
                        textView2.text = "Handler 0"
                    }
                    1 -> {
                        textView2.text = "Handler 1"
                    }
                    2 -> {
                        textView2.text = "Handler 2 : ${msg.arg1}, ${msg.arg2}, ${msg.obj}"
                    }
                }

            }
        }

        // 오래 걸리는 작업
        isRunning = true

        thread {
            while (isRunning) {
                val now2 = System.currentTimeMillis()
                Log.d("test", "오래걸리는 작업 $now2")

                SystemClock.sleep(500)
                // 0 은 handler의 msg.what에 저장된다
                handler1.sendEmptyMessage(0)

                SystemClock.sleep(500)
                // 1 은 handler의 msg.what에 저장된다
                handler1.sendEmptyMessage(1)

                SystemClock.sleep(500)
                val msg = Message()
                msg.what = 2
                msg.arg1=100
                msg.arg2 = 200
                msg.obj = "객체"
                handler1.sendMessage(msg)

            }
        }
    }

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

728x90

'안드로이드 > Thread' 카테고리의 다른 글

안드로이드 RunOnUiThread  (0) 2022.06.16
Handler를 이용한 반복 작업  (0) 2022.06.16
안드로이드 Thread  (0) 2022.06.14