앱에서 시간이 걸리는 작업을 수행할 때 ProgressDialog 클래스를 이용하면 사용자에게 실시간 진행 상태를 알릴 수 있습니다. 그리고 진행이 다 끝나면 팝업창은 사라지게 됩니다. 이런 ProgressDialog 에는 두 가지 종류가 있습니다. "스핀" 과 진행정도를 나타내는 "바" 형태의 다이얼로그입니다.

▼ 먼저 스핀 ProgressDialog 다이얼로그를 살펴 보겠습니다. 스핀은 진행과정을 표시하지는 않고 계속해서 돌아가는 그림만 보여주죠. ProgressDialog 의 setProgressStyle() 함수에 ProgressDialog.STYLE_SPINNER 옵션을 넘기시고 setMessage() 에 표현하고 싶은 메시지를 입력합니다. 마지막으로 다이얼로그를 띄우기 위해 show() 함수를 호출합니다.
ProgressDialog asyncDialog = new ProgressDialog( ProgressDialogActivity.this); @Override protected void onPreExecute() { asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); asyncDialog.setMessage("로딩중입니다.."); // show dialog asyncDialog.show(); super.onPreExecute(); }
▼ 진행 다이얼로그(ProgressDialog) 를 독립적으로 사용되면 의미가 없죠. 시간이 걸리는 작업을 하기 때문에 Thread 나 AsyncTask 클래스에 포함되어서 사용됩니다. AsyncTask 는 Thread 를 사용할 일이 있을 때 좀더 편리하게 이용할수 있도록 안드로이드에서 지원하고 있는 클래스 입니다. AsyncTask 를 상속받아 만든 클래스는 3가지 함수를 구현해야 합니다. 이 3가지 함수들에 ProgressDialog 기능을 구현하시면 됩니다.
◎ onPreExecute() : 작업시작, ProgressDialog 객체를 생성하고 시작합니다.
◎ doInBackground() : 진행중, ProgressDialog 의 진행 정도를 표현해 줍니다.
◎ doPostExecute() : 종료, ProgressDialog 종료 기능을 구현합니다.
import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; public class ProgressDialogActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_dialog); CheckTypesTask task = new CheckTypesTask(); task.execute(); } private class CheckTypesTask extends AsyncTask<Void, Void, Void> { ProgressDialog asyncDialog = new ProgressDialog( ProgressDialogActivity.this); @Override protected void onPreExecute() { asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); asyncDialog.setMessage("로딩중입니다.."); // show dialog asyncDialog.show(); super.onPreExecute(); } @Override protected Void doInBackground(Void... arg0) { try { for (int i = 0; i < 5; i++) { //asyncDialog.setProgress(i * 30); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { asyncDialog.dismiss(); super.onPostExecute(result); } } }

▼ 두번째 ProgressDlg 의 형태인 진행바 입니다. ProgressDialog.STYLE_SPINNER 대신ProgressDialog.STYLE_HORIZONTAL 입력하시면 됩니다. 그리고 나머지 셋팅은 동일하죠.
ProgressDialog asyncDialog = new ProgressDialog( ProgressDialogActivity.this); @Override protected void onPreExecute() { asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); asyncDialog.setMessage("로딩중입니다.."); // show dialog asyncDialog.show(); super.onPreExecute(); }
▼ ProgressDlg 의 진행바 형태이기 때문에 진행정도를 나타낼수 있도록 셋팅을 해주어야 합니다. AsyncTask 에서 doInBackground() 함수가 작업 진행을 알리는 CALLBACK 함수이죠. 이곳에 ProgressDlg 의 setProgress() 함수를 셋팅해 주시면 됩니다.
import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; public class ProgressDialogActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_dialog); CheckTypesTask task = new CheckTypesTask(); task.execute(); } private class CheckTypesTask extends AsyncTask<Void, Void, Void> { ProgressDialog asyncDialog = new ProgressDialog( ProgressDialogActivity.this); @Override protected void onPreExecute() { asyncDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); asyncDialog.setMessage("로딩중입니다.."); // show dialog asyncDialog.show(); super.onPreExecute(); } @Override protected Void doInBackground(Void... arg0) { try { for (int i = 0; i < 5; i++) { asyncDialog.setProgress(i * 30); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { asyncDialog.dismiss(); super.onPostExecute(result); } } }
▼ 아래 그림처럼 doInBackground() 에 setProgress() 값을 셋팅해주시면 작업이 종료 될 때까지 바 그래프와 숫자값이 바뀌겠죠. 이상으로 ProgressDlg 의 두가지 형태를 AsyncTask 와 함께 어떤식으로 사용하는지 알아 보았습니다.
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) Activity 에서 이미지 리소스 drawable 다루는 방법 (4) | 2024.04.28 |
---|---|
안드로이드 콘솔에서 adb shell 패키지 접근 권한 Permission denied 에러 해결 (1) | 2024.04.11 |
안드로이드 개발 Intent 이용한 전화 걸기 (5) | 2024.03.23 |
안드로이드(Android) scale 이용해서 애니메이션(Animation) 구현하는 방법 (2) | 2024.03.07 |
안드로이드 개발 ContentProvider, ContentResolver 이용해서 연락처 가져오는 방법 (3) | 2024.02.09 |
안드로이드 스튜디오 개발 APK 파일 찾는 방법 (0) | 2023.07.10 |
안드로이드(Android) ImageView scale type 별로 이미지 배치 하는 방법 (0) | 2023.01.24 |
안드로이드 개발 에러 have you declared this activity in your AndroidManifest.xml ? (0) | 2023.01.14 |
녹두장군1님의
글이 좋았다면 응원을 보내주세요!