안드로이드/Thread

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

김어찐 2022. 6. 16. 11:47
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