Please Enable JavaScript!
Gon[ Enable JavaScript ]

반응형

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

 

 

※ 아래는 참고하면 좋을 만한 글들의 링크를 모아둔 것입니다.
안드로이드(Android) 다이얼로그 Dialog 텍스트 링크 거는 방법
안드로이드(Android) 기본 알림창 AlertDialog 선택 목록창
안드로이드(Android) 다이얼로그(Dialog) Animation 효과
안드로이드(Android) 기본 알림창 AlertDialog 띄우는 방법
드로이드(Android) 기본 알림창인 AlertDialog

 

 

 

 

▼ 두번째 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) 다이얼로그 Dialog 텍스트 링크 거는 방법
안드로이드(Android) 기본 알림창 AlertDialog 선택 목록창
안드로이드(Android) 다이얼로그(Dialog) Animation 효과
안드로이드(Android) 기본 알림창 AlertDialog 띄우는 방법
드로이드(Android) 기본 알림창인 AlertDialog
반응형
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  댓글주소  수정/삭제  댓글쓰기

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

  5. Favicon of https://kkkapuq.tistory.com 주닝! 2020.10.25 19:24 신고  댓글주소  수정/삭제  댓글쓰기

    포스팅 감사합니다. 혹시 해당 프로그레스에 따라 로딩창 텍스트 내용을 변경하려면 어떻게 해야되는지 알 수 있을까요..? 찾아도 잘 안나오네요 ㅠㅠ..