Android : Progress Dialog 사용하기(Thread, Handler 이해)

hjseo-dev·2022년 3월 29일
0

Android

목록 보기
9/18

📍 ProgressDialog 란?

ProgressDialog는 안드로이드가 어떤 작업을 진행할때 그 작업의 진행상황과 부가적인 문장을 팝업창으로 보여주는 모듈입니다. 시간이 걸리는 파일 다운로드나 복사를 수행할 때 이런창을 띄워주면 기다리는데 유저의 거부감을 줄일 수 있습니다.

  • ProgressDialog는 다이얼로그가 표시되는 동안 유저가 다른 조작을 못하게 된다는 이유로 Android 8.0(API level 26)부터는 deprecated 되고 대신 ProgressBar를 사용하도록 권장하고 있습니다.

프로그램 작성

버튼을 터치하면 진행율이 0.2초당 10%씩 증가하는 ProgressDialog를 만들어 보면서 Thread를 구현해 보겠습니다.

//초기화
private lateinit var progressDialog: ProgressDialog

//프로그래스 설정 (초기값, 스타일)
progressDialog = ProgressDialog(this)
progressDialog.max = 100
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
progressDialog.setTitle("Download Task")
progressDialog.setMessage("Please wait, we are downloading your files...")
progressDialog.setCancelable(false)
progressDialog.show()

📍 스레드와 핸들러

출처 : https://academy.realm.io/kr/posts/android-thread-looper-handler/

한 프로세스 안에서 여러개의 스레드를 사용하게 되면 서로다른 스레드가 버튼이나 텍스트뷰 등의 UI 컴포넌트에 동시에 접근하는 문제가 생길 수 있습니다. 안드로이드에서는 이것을 막기 위해 처리흐름 중간에 Looper와 Handler를 끼워 넣었습니다.

스레드는 수행해야 할 UI 작업이 발생하면 Message 또는 Runnable을 만들어내고 이걸 Message queue에 담습니다. Looper는 무한히 루프를 돌며 Message queue속의 객체를 핸들러에 전달합니다. Handler는 메시지를 받으면 운영체제가 정해주는 타이밍에 따라 UI조작을 수행하게 되므로 UI요소에 대한 동시접근을 막을 수 있게 됩니다.

val handler: Handler = object : Handler() {
    override fun handleMessage(msg: Message) {
        super.handleMessage(msg)
        progressDialog.incrementProgressBy(10)
    }
}

Thread {
    try {
        while (progressDialog.progress <= progressDialog.max) {
            Thread.sleep(200)  //0.2초 간격으로 정지시킴
            handler.sendMessage(handler.obtainMessage())
            if (progressDialog.progress == progressDialog.max) {
                progressDialog.dismiss()
            }
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}.start()

쓰레드에서는 매 루프마다 현재 progress 값을 체크하고 그 값이 최대값보다 작으면 핸들러에 메시지를 보냅니다. 이 때 Thread.sleep을 이용해 0.2초 간격으로 스레드를 정지시킵니다.

0개의 댓글