티스토리 뷰
반응형
비동기 처리를 하기 위해 사용합니다.
버튼을 클릭하면 현재 시간을 초 단위로 가져오는 코드를 작성해 보았습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
textView.text = "${System.currentTimeMillis()}"
}
}
}
실행하면 아래와 같이 동작합니다.
버튼을 클릭했을 때 시간이 나오도록 하고 싶은 게 아니라 실시간으로 바뀐 시간을 출력하고 싶어서 코드를 아래와 같이 작성하였습니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
while (true) {
textView.text = "${System.currentTimeMillis()}"
}
}
}
실행을 하게 되면 아래와 같이 ANR이 발생합니다.
Main Thread에서 계산을 계속해주지만 Ui에 적용을 못하고 있습니다.
이때 Thread를 사용하여 처리를 해줄 수 있습니다.
class MainActivity : AppCompatActivity() {
var isRunning = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
isRunning = true
Thread1().start()
}
inner class Thread1 : Thread() {
override fun run() {
while (isRunning) {
Thread.sleep(1000)
textView.text = "${System.currentTimeMillis()}"
}
}
}
override fun onDestroy() {
super.onDestroy()
isRunning = false
}
}
isRunning 변수를 통해 true로 바뀌면 Thread가 계속 돌아가게 하였고, onDestroy가 되면 false로 바뀌게 하였습니다.
그리고 직접 만든 Thread 클래스로 처리를 하였습니다.
하지만 문제가 있습니다. 오레오 버전 이상에서만 개발자 직접 만든 Thread에서 Ui처리가 가능합니다.
즉, 낮은 버전은 무조건 Main Thread에서만 Ui 처리가 가능합니다.
이때 runOnUiThread를 사용하면 됩니다.
runOnUiThread {
textView.text = "${System.currentTimeMillis()}"
}
위와 같이 Ui 변경 부분을 runOnUiThread로 처리를 하여 Main Thread에서 처리가 되게 해 줍니다.
실행 결과는 아래와 같습니다.
반응형
'알려주는 이야기 > 안드로이드' 카테고리의 다른 글
안드로이드 AsyncTask (0) | 2020.08.20 |
---|---|
안드로이드 Handler (0) | 2020.08.20 |
안드로이드 권한 (0) | 2020.08.19 |
안드로이드 notification 예제 (0) | 2020.08.18 |
안드로이드 action bar (0) | 2020.08.17 |
댓글