본문 바로가기

안드로이드 - ProgressBar '프로그래스바' / ProgressDialog '프로그래스 다이얼로그' 사용

ProgressBar '프로그래스바'

     작업 진행 정도나 진행 중임을 보여주기 위한 View

     2가지 종류 - '막대 모양 / 원 모양'

Dialog 기본 스타일

 

Dialog 레이아웃 변경

 

1) 막대 모양

   - 진행 정도를 표시하기 위한 'ProgressBar 클래스'

   - style="?android:attr/progressBarStyleHorizontal" : 막대 스타일 설정

   - indeterminateOnly="false" : 최대범위 지정없이, 현재 진행형임을 표시할건지

   - max : 최대 범위

   - progress : 초기 값

   - Java Method

          void setProgress(int progess) : progress 값으로 진행 정도 설정

          void incrementProgressBy(int difference) : 현재 값 기준으로 더하거나 빼기 설정

<ProgressBar
        android:id="@+id/progress"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        style="?android:attr/progressBarStyleHorizontal"	// 막대 스타일 설정
        android:indeterminateOnly="false"	// 현재 진행형 여부(값x, 원형), false
        android:max="100"			// 최대 범위설정, 100
        android:progress="25"		// 초기 값(progress) 설정, 25
/>

 

2) 원 모양

   - 진행 중임을 표시하기 위한 'ProgressDialog 클래스'

   - ProgressDialog

          new ProgressDialog(context, android.R.style.Theme_Material_Dialog_Alert)

                                                    : 생성자 함수, 안드로이드 제공 레이아웃 변경

          void setProgressStyle(ProgressDialog.STYLE_SPINNER : Style 원 모양 설정

          void setMessage(String msg) : 표시할 Message

          void setCanceledOnTouchOutside(false) : 화면 터치 시 Dialog 꺼짐 막기 설정

          void show() : Dialog UI 표시

          void dismiss() : Dialog UI 제거

 

AsyncTask에서 실행

     onPreExecute() -> doInBackground()  -> onPostExecute() 

                                            ↘ onProgressUpdate() : 백그라운드 작업 중 UI조작 위해, publishProgress()

class Progress_Task extends AsyncTask<Integer, Integer, Void> {
        private ProgressDialog progressDialog = null;       // 원형 ProgressBar 생성
        public Progress_Task() { super(); }

        @Override
        // doInBackground 전에 실행(UI Thread) - 백그라운드 작업 전 초기화 부분
        protected void onPreExecute() {
            super.onPreExecute();
            // ProgressDialog 생성, 레이아웃 변경
            progressDialog = new ProgressDialog(ProgressActivity.this, android.R.style.Theme_Material_Dialog_Alert);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);      // Style - 원 모양 설정
            progressDialog.setMessage("Loadingg...");                           // Message - 표시할 텍스트
            progressDialog.setCanceledOnTouchOutside(false);                    // 터치시 Canceled 막기
            progressDialog.show();                                              // UI 표시
        }

        @Override
        // 백그라운드 작업 시작, UI 조작 불가, onPreExcute() 종료후 바로 호출
        protected Void doInBackground(Integer... ints) {
            for (int i = 0; i < 4; i++) {
                try {
                    // UI Update, publishProgress() - onProgressUpdate 호출
                    publishProgress(ints[0]);
                    Thread.sleep(500);                  // 0.5초 간격 UI Update
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        // UI 조작가능 (UI Thread에서 실행)
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressBar.incrementProgressBy(values[0]);
            progress_value.setText(progressBar.getProgress()+"%");
        }

        @Override
        // UI Thread에서 실행, doInBackground 종료 후 바로 호출
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progressDialog.dismiss();       // ProgressDialog 지우기
            progressBar.setProgress(20);
            progress_value.setText(progressBar.getProgress()+"%");
        }
    }

 

Thread 실행

     Background 작업 중 중간중간 UI 조작위해, runOnUiThread() 내부 선언

 progress_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Thread 생성 - Background 작업위해
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // ProgressBar Update - 4번 반복
                        for (int i = 0; i < 4; i++) {
                            // runOnUiThread() - Background 작업 중 UI 조작위해 
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    progressBar.incrementProgressBy(20);
                                    progress_value.setText(String.valueOf(progressBar.getProgress()));
                                }
                            });
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                progressBar.setProgress(20);
                                progress_value.setText(String.valueOf(progressBar.getProgress()));
                            }
                        });
                    }
                }).start();     // Thread Background 작업 실행
            }
        });