UMC_안드로이드_4주차

Falco·2021년 12월 29일
0

핵심 키워드 🎯

  • Thread
    • Thread는 동기적? 비동기적?
    • Thread의 문제점
    • 해결방법
  • Handler
  • Looper
  • Thread 종료
  • Splash Theme

하나의 프로그램을 실행시키면 이것은 프로세스가되어서 진행됨.
나는 노래도 들으면서 웹사이트를 움직인다. 이들은 각자 자기의 역할을 동시에 수행하고 있을 것이다. 우리가 자연스럽게 하고있는 이것이 바로 쓰레드이자 멀티쓰레딩이다.

But 여기서, 멀티 스레드와 멀티 프로세스의 차이점을 인지하고 넘어가야함.

멀티 스레드란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 말한다.
멀티 프로세스란 여러개의 CPU 를 사용하여 여러 프로세스를 동시에 수행하는 것을 말한다.
launch 되면, 안드로이드 시스템은 해당 어플리케이션의 main thread 를 생성한다.

앱이 실행되면 main thread 가 실행됨, 이 쓰레드는 UI 위젯들을 그리는 역할을 수행함 또한, 이 쓰레드는 UI 와 상호작용할 때 사용된다. 이렇게, main thread는 UI 를 그리고 상호작용하는 역할과 밀접한 관련이 있기 때문에 UI thread 라고도 불린다.

  • 쓰레드의 동기 및 비동기 에 대한 설명 (블로그1 ,블로그2)

    AJAX가 돌아가는 방법과 동일한 것 같다. 비동기식이 응답시간도 빠르고 좋을 것 같지만,
    동기화 문제, 버그도 많이 발생, 프로그래밍 난이도가 가파르게 상승 But 프로그램이 엄청난 속도 향상

우리가 따로 Thread를 실행시키면 UI를 건드리지 못한다.

  • Handler
  • Looper

그러나 이들을 사용하여 UI를 건드릴 수 있음

inner class Player() : Thread (){
        var mil = 0
        override fun run() {
            try {
                while(true && threadcondition){
                    if(song.nowPlay >= song.playTime){
                        runOnUiThread {
                            initChangesong()
                            nextSong()
                        }
                    }
                    if(song.isPlaying){
                        mil = mil + 100
                        sleep(100)
                        if(mil >= 1000){
                            mil = 0
                            song.nowPlay ++
                            runOnUiThread{
                                if(!ontouchnow) {
                                    binding.mainSongSeekbar.progress = song.nowPlay *1000 / song.playTime
                                }
                            }
                        }
                    }
                }
            }catch (e : InterruptedException){
            }

        }

    }

잡다한 소스는 중요하지 않다.
우리는 여기서 Activity내에서 Player()이라는 쓰레드를 inner class로 만들어서 사용하였고, 이에 따른 Activity내의 함수를 이용하기 위해 runOnUiThread{}를 사용하여 내부 UI를 건드리거나 함수를 실행시키는 것을 알 수 있다.

아니면

private val handler = Handler(Looper.getMainLooper())

쓰레드를 관리해주는 핸들러를 선언해주어 사용할 수도 있다.

	player = Player()
        player.start() //시작
        plaery.interrupt() //멈추기

Handler(Looper.getMainLooper()).postDelayed({
            val authService = AuthService()
            authService.setSignUpView(this)
            authService.autologin(getJwt(this))

            //네트워킹 처리, 데이터 처리를 요기서
        },2000)

이는 스플래쉬 화면에서의 Handler를 사용하는 모습이다.
authService로 자동 로그인이 될때까지 2000ms동안 딜레이를 줌

이후

        var intent = Intent(this, MainActivity::class.java)
        startActivity(intent)

메인엑티비티를 실행

profile
강단있는 개발자가 되기위하여

0개의 댓글