티스토리 뷰



이 자료들은 팁스소프트에서 제공하는 [ 알짜배기 ] 프로그램을 이용하면 더 편리하게 볼수 있습니다.
* 알짜배기 프로그램 받기 - http://www.tipssoft.com/bulletin/tb.php/QnA/8406
* 관리자의 Tipssoft 이야기를 들어보세요 ( 트위터 ID : tipssoft )
* 안드로이드 강좌 목록 - http://www.tipssoft.com/bulletin/tb.php/old_bbs/501
안드로이드용 기기를 사용하다보면 백그라운드에서 어플리케이션을 설치하거나 데이터를 송수신하면서
현재 작업의 진행 상황을 알려주고, 작업이 종료될때까지 사용자가 기다려줄 것을 표현하기 위해서
프로그래스 대화상자를 띄우는 것을 종종 볼 수 있습니다.
이전 강좌에서 살펴봤던 원형 대화상자는 한번 실행하면 대화상자가 종료될 때까지 일정한 방향으로
반복하여 회전하는 애니메이션이 출력됐지만 바형 프로그래스 대화상자는 시작 지점과 끝 지점이
존재하여 사용자가 지정하는 값만큼 바가 채워지는 애니메이션으로 출력됩니다. 그래서 원형 대화상자와
달리 바형 프로그래스가 끝 지점까지 채워지는 과정을 사용자가 직접 구성해주어야 합니다.
이와 같은 특징때문에 메인 스레드가 아닌 추가적인 스레드를 사용하여 다운로드를 수행하거나 설치
작업을 수행할 때 해당 작업이 얼마 만큼 수행되었는지 계산하여 일정 수행마다 프로그래스의 현재 위치
값을 갱신하도록 해주어야 합니다.
이제부터 바형 프로그래스 대화상자를 사용하는 방법에 대하여 알아보도록 하겠습니다.
1. 대화상자 실행하기
바형 프로그래스 대화상자는 AlertDialog 클래스의 하위 클래스인 ProgressDialog 클래스를 이용하여
생성합니다. 원형 프로그래스 대화상자와 대화상자를 생성하는 부분이 비슷하지만 프로그래스가 채워
지는 애니메이션을 구현하기 위해서 사용자가 직접 프로그래스의 현재 위치값을 설정해주어야 한다는
차이점이 있습니다.
바형 프로그래스 대화상자는 지속적으로 해당 대화상자의 멤버 메소드를 호출해야 하기때문에 멤버
변수로 선언하며 onCreateDialog 메소드를 재정의하여 아래와 같이 생성할 수 있습니다.
// 대화상자를 멤버변수로 선언
ProgressDialog m_progress_dlg = null;
// 대화상자를 생성할 때 수행되는 메소드
protected Dialog onCreateDialog(int id)
{
switch(id) {
// 프로그래스 대화상자인 경우
case PROGRESS_DIALOG : {
// 프로그래스 대화상자를 생성한다.
m_progress_dlg = new ProgressDialog(this);

// 대화상자에 제목을 설정한다.
m_progress_dlg.setTitle("Notify!!");
// 대화상자에 문자열 메세지를 설정한다.
m_progress_dlg.setMessage("Please wait...");
// 프로그래스의 형태를 원형으로 설정한다.
m_progress_dlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// Back 버튼으로 취소가 가능하도록 설정한다.
m_progress_dlg.setCancelable(true);
// Back 버튼을 터치하여 취소가 발생했을 때 처리할 사항을 리스너로 등록한다.
m_progress_dlg.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel (DialogInterface dialog) {

// 프로그레스 바의 값을 증가시키는 쓰레드를 중지시킨다.
stopProgressThread();
}
});

// 프로그래스 대화상자를 반환한다.
return m_progress_dlg;
}
}
return null;
}
onCreateDialog 메소드를 재정의하여 대화상자를 사용하면 한번 생성된 대화상자는 명시적으로
제거할 때까지 재사용되기때문에 해당 메소드에서는 기본적으로 생성시 필요한 설정만 해주는 것이
좋습니다. 대화상자가 실행될 때마다 수행해야할 작업들은 onPrepareDialog 메소드를 재정의하여
명시해주어야 합니다.
바형 프로그래스 대화상자의 경우 추가적인 스레드에서 별도의 작업을 수행하면서 작업의 경과를
표시할 때 주로 쓰이기때문에 onPrepareDialog 메소드에서 스레드를 수행시키도록 하거나 별도의
스레드가 작업을 시작할 때 대화상자를 출력하도록 해주어야합니다.
아래의 코드는 대화상자가 시작될 때 별도의 스레드를 생성하여 프로그래스의 현재값을 증가시키도록
구성한 것입니다.
// 대화상자가 출력되기 전에 호출되는 메소드
protected void onPrepareDialog (int id, Dialog dialog)
{
if(id == PROGRESS_DIALOG) {
// 프로그래스의 현재값이 최대값보다 크거나 같은 경우에 0으로 초기화한다.
if(m_progress_value >= m_max_value) m_progress_value = 0;
// 취소 여부를 판단하는 flag 변수를 초기화한다.
m_cancel_progress_flag = false;
// 프로그래스바의 최대값을 설정한다.
((ProgressDialog)dialog).setMax(m_max_value);
// 프로그래스바에 표시될 현재 값을 설정한다.
((ProgressDialog)dialog).setProgress(m_progress_value);
// 쓰레드를 생성한다.
m_progress_thread = new Thread(this);
// 쓰레드를 시작한다.
m_progress_thread.start();
}
}
// 추가된 스레드가 수행할 메소드
public void run()
{
// 랜덤 값을 만들어주는 Random 객체를 생성한다.
Random r = new Random(System.currentTimeMillis());
// 현재값이 최대값보다 작으면 수행한다.
while(m_progress_value < m_max_value){
try {
// 100 밀리초간 기다린다.
Thread.sleep(100);
} catch (InterruptedException e) {
m_display_string = e.toString();
m_text_view.post(m_display_run);
}

// 10 이하의 랜덤한 수를 더한다.
m_progress_value += r.nextInt(10);

// 대화상자가 취소되지 않았으면 증가한 현재값을 대화상자에 반영시킨다.
// 해당 작업은 메인 스레드에서만 가능하기때문에 메인 스레드로 Runnable 객체를 전달한다.
if(m_cancel_progress_flag == false) m_text_view.post(m_progress_run);
else break; // 취소됐으면 반복문을 나간다.
}
// 스레드 초기화
m_progress_thread = null;
}
// 프로그레스바에 값을 설정하는 작업이 정의된 Runnable 객체
Runnable m_progress_run = new Runnable() {
public void run()
{
// 현재 표시할 값이 최대값을 넘으면 최대값으로 대체한다.
if(m_progress_value > m_max_value) m_progress_value = m_max_value;
// 대화상자의 프로그레스바에 표시할 값을 설정한다.
m_progress_dlg.setProgress(m_progress_value);
// 현재 값이 최대값 이상인 경우
if(m_progress_value >= m_max_value) {
// 대화상자를 닫는다.
dismissDialog(PROGRESS_DIALOG);
}
}
};
2. 대화상자 실행 화면
아래 그림은 위의 코드를 토대로 프로그래스 대화상자를 띄우는 예제를 구성한 것입니다. Show
Dialog 버튼을 터치하면 프로그래스 바로 구성된 대화상자가 출력되며 프로그래스의 현재 값이 300이
되어서 100%가 되면 대화상자가 종료됩니다.


댓글