Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[39일차 Android] Thread, runOnUiThraad 본문

Computer/Android

[39일차 Android] Thread, runOnUiThraad

Wise-99 2023. 6. 26. 18:25

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Thread

  • 안드로이드는 Activity의 코드를 처리하기 위해 Thread를 발생 시킨다
  • 이 때 발생되는 Thread를 Main Thread라고 부르며 UI Thread라고 부르기도 한다.
  • Main Thread가 현재 어떠한 처리도 하지 않고 유휴 상태일때만 화면 작업이 가능하다.
  • 이 때문에 오래 걸리는 작업은 별도의 Thread를 발생시켜 처리하고 Main Thread를 항상 유휴 상태로 유지하게 해야 한다.

화면 처리

  • 안드로이드는 개발자가 발생 시킨 Thread에서 화면에 대한 처리를 하면 오류가 발생한다.
  • 현재 안드로이드 오래오(8.0) 이상 부터는 개발자가 발생 시킨 Thread에서 화면 처리가 가능하다.
  • 허나 OS 버전이 변경되면서 상황은 달라질 수도 있고 하위 버전을 위해 화면 처리는 반드시 Main Thread에서 하는 것이 좋다.

runOnUiThraad

  • 개발자가 발생시킨 일반 Thread에서 코드 일부를 Main Thread가 처리하도록 하는 메서드
  • 이를 이용해 Handler 대신하여 Thread를 운영할 수 있다.

 

 

예제 코드

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            button.setOnClickListener {
                val now = System.currentTimeMillis()
                textView.text = "now : $now"
            }
        }

        // 100 ms 마다 한번씩 현재 시간을 가져와 출력한다.
        while(true){
            SystemClock.sleep(100)
            val now2 = System.currentTimeMillis()
            // activityMainBinding.textView2.text = "now2 : $now2"
            Log.d("now2", "now2 : $now2")
        }
    }
}
  • 해당 코드는 while문으로 현재 시간을 계속 Logcat에 출력한다.
  • 그러나 해당 코드는 onCreate() 내부에서 실행했기 때문에 onCreate()가 끝나지 않아 앱 화면이 나오지 않는다.

 

 

 

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            button.setOnClickListener {
                val now = System.currentTimeMillis()
                textView.text = "now : $now"
            }
        }

        thread {
            while(true){
                SystemClock.sleep(100)
                val now2 = System.currentTimeMillis()
                Log.d("now2", "now2 : $now2")

                runOnUiThread {
                    activityMainBinding.textView2.text = "now2 : $now2"
                }
            }
        }
    }
}

 

  • 위의 while문 코드를 보완하기 위해 Thread를 사용하여 구현한 코드이다.
  • 사용자가 발생 시킨 Thread 안에서 화면에 관련된 작업이 필요하다면 runOnUiThread를 사용한다.
  • runOnUiThread 안에 만들어놓은 코드는 MainThread가 처리하도록 요청한다.
  • 그러나 Kotlin 기반으로 안드로이드 애플리케이션을 제작할 경우 runOnUiThread를 사용하는 것을 미리 구현해놨기 때문에 runOnUiThraad를 사용하지 않아도 된다.

'Computer > Android' 카테고리의 다른 글

[39일차 Android] Service  (0) 2023.06.29
[39일차 Android] Broadcast Receiver  (0) 2023.06.27
[38일차 Android] 다양한 Notification  (0) 2023.06.25
[38일차 Android] Pending Intent  (0) 2023.06.25
[38일차 Android] Notification  (0) 2023.06.25