하나의 프로그램을 실행시키면 이것은 프로세스가되어서 진행됨.
나는 노래도 들으면서 웹사이트를 움직인다. 이들은 각자 자기의 역할을 동시에 수행하고 있을 것이다. 우리가 자연스럽게 하고있는 이것이 바로 쓰레드이자 멀티쓰레딩이다.
But 여기서, 멀티 스레드와 멀티 프로세스의 차이점을 인지하고 넘어가야함.
멀티 스레드란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 말한다.
멀티 프로세스란 여러개의 CPU 를 사용하여 여러 프로세스를 동시에 수행하는 것을 말한다.
launch 되면, 안드로이드 시스템은 해당 어플리케이션의 main thread 를 생성한다.
앱이 실행되면 main thread 가 실행됨, 이 쓰레드는 UI 위젯들을 그리는 역할을 수행함 또한, 이 쓰레드는 UI 와 상호작용할 때 사용된다. 이렇게, main thread는 UI 를 그리고 상호작용하는 역할과 밀접한 관련이 있기 때문에 UI thread 라고도 불린다.
우리가 따로 Thread를 실행시키면 UI를 건드리지 못한다.
그러나 이들을 사용하여 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)
메인엑티비티를 실행