Please Enable JavaScript!
Gon[ Enable JavaScript ]

안드로이드(Android) ProgressDialog(프로그레스 다이얼로그) 구현 방법

 

환경: Eclipse Mars, Android 4.2.2

 

앱에서 시간이 걸리는 작업을 수행할 때 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 와 함께 어떤식으로 사용하는지 알아 보았습니다.

 

 

Posted by 녹두장군

댓글을 달아 주세요

  1. 초보자 2015.04.29 17:49  댓글주소  수정/삭제  댓글쓰기

    안녕 하세요 인터넷을 한참 찾아 헤메다 방문 하게 되었습니다.
    지금 제가 서버 통신 부분을 AsyncTask 로 구현은 해 놨는데 ProgressDialog 가 없어 위에 해 두신
    스핀 ProgressDialog를 사용 해보려고 하는데요....잘 않되서요.... 혹시 염치 불구 하고...위에 구현 해 놓으신 소스좀 받을수 있을까 해서 이렇게 글 남겨 봅니다.....

    • Favicon of https://mainia.tistory.com 녹두장군 2015.04.29 22:17 신고  댓글주소  수정/삭제

      android.app.ProgressDialog; 는 안드로이드 API 기본 클래스 입니다.
      Ctrl + Shift + O 를 하시면 자동으로 추가 될겁니다. 다시 한번 해보시기
      바랍니다. ^^

  2. 창효 2016.01.20 12:44  댓글주소  수정/삭제  댓글쓰기

    녹두장군님 블로그에서 늘 양질의 자료를 얻어갑니다.

    좋은 정보 감사합니다~

  3. space 2016.09.02 09:08  댓글주소  수정/삭제  댓글쓰기

    포스팅 잘 봤습니다. 그런데 왼쪽하단에 60% 표시가 있는데 오른쪽에 60/100은 왜나오는건가요? 숫자표시하는부분이 어느부분인지를 잘 모르겠습니다.

    • Favicon of https://mainia.tistory.com 녹두장군 2016.09.02 10:06 신고  댓글주소  수정/삭제

      전체 값 대비 현재 값을 표시하는 부분인데 % 단위는 당연히 100% 겠지만 % 가 일반 숫자로 표시한다면 최대값이 얼마인지 표시할 필요가 있겠죠. 이 부분을 수정하는 함수는 더 찾아봐야겠네요.

  4. 송경호 2018.07.28 12:01  댓글주소  수정/삭제  댓글쓰기

    백프레스 버튼에 다이얼로그를 뛰워서 애드몹 광고를 구현하고싶은데 어떻게 구현하는지 알고싶습니다 ㅠ