앱에서 시간이 걸리는 작업을 수행할 때 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 |