본문 바로가기

안드로이드

안드로이드 : GUI 시스템에서 UI 갱신과 Logcat

GUI 시스템에서 UI 갱신

GUI 시스템에서는 main thread 만 UI 갱신이 가능

하나의 메소드 안에서 UI 를 갱신하는 코드와 다른 코드가 같이 존재하면 UI 를 갱신하는 코드는 비동기적으로 동작합니다.

 

비동기: 현재 작업을 처리하는 도중에 다른 작업을 처리할 수 있는 방식

하나의 메소드 안에 UI 를 갱신 하는 코드가 여러개 존재하면 모아서 한꺼번에 처리합니다.

 

Logcat

안드로이드에서 로그를 출력하고자 할 때 System.out.print 나 print 를 사용 할 수 없습니다.

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import kotlinx.android.synthetic.main.activity_main2.*

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        val clickListener : View.OnClickListener = object : View.OnClickListener{
            override fun onClick(v: View?) {
                var btn : Button = v as Button
                label.setText("${v?.text} 누름")
            }
        }
        // 이벤트 라우팅
        button1.setOnClickListener(clickListener)
        button2.setOnClickListener(clickListener)
        button3.setOnClickListener(clickListener)

        var i = 0
        while (i<10){
            // TextView 의 텍스트 변경
            label.text = "${i}"
            // 로그를 출력
            Log.e("i",  "${i}")
            i = i + 1
            // 1초 씩 대기
            Thread.sleep(1000)
            Log.e("x", "y")

        }

/*
        button1.setOnClickListener {
            label.text = "버튼 1을 눌렀습니다."
        }
*/
    }
}

UI 를 주기적으로 갱신

Thread 와 Handler 를 이용하는 방법Timer 를 이용

val 이름:CountDownTimer = object.CountDownTimer(전체 시간, 주기){
    // 주기적으로 호출하는 메소드
    override fun onTick(millisUntilFinished:Long){
    	주기적으로 수행할 내용
    }
    //타이머 종료 후 호출하는 메소드
    override fun onFinish(){
    	마지막에 수행할 내용
	}
}
이름.start() // 시작
이름.calcel() // 중지
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.CountDownTimer
import android.view.View
import android.widget.Button
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main2.*

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        val clickListener : View.OnClickListener = object : View.OnClickListener{
            override fun onClick(v: View?) {
                var btn : Button = v as Button
                label.setText("${v?.text} 누름")
            }
        }
        // 이벤트 라우팅
        button1.setOnClickListener(clickListener)
        button2.setOnClickListener(clickListener)
        button3.setOnClickListener(clickListener)
        
        val timer:CountDownTimer =
            object:CountDownTimer(10000, 1000) {
                var x : Int = 0
                // 주기적으로 호출 되는 메소드
                override fun onTick(millisUntilFinished: Long) {
                    label.text = "${x}"
                    x = x + 1
                }
                // 타이머 수행이 종료되면 호출되는 메소드
                override fun onFinish() {
                    Toast.makeText(this@MainActivity2, "완료", 
                    Toast.LENGTH_LONG).show()
                }
            }
        timer.start()
    }
}