스마트기기개발관련/안드로이드 개발

안드로이드 개발 다이얼로그 진행바(프로그래시브바) 달기 관련

AlrepondTech 2015. 9. 8. 13:55
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: http://m.blog.naver.com/wono77/140108150226

 

문서히스토리:

2010년 6월 4일 글최초작성(비공개)

2010년 10월 1일 글공개전환

 

 

 

 

sdcard 부분 구현할때만큼이나 많은 고민을 했고,

자료 찾는데 시간이 걸렸던 부분인 듯 하다.

 

도대체 어떻게 화면 한가운데에 프로그레스바를 띄운걸까?

레이어를 쓴걸까?

고민을 많이 했었는데, 책에도 없고

인터넷의 글들도 별로 탐탐치 않았다.

 

다이얼로그 박스를 쓰고,

시간이 많이 걸리는 부분을 쓰레드로 구현하고

시간이 많이 걸리는 함수 안에서 진행상태 수치를 알려주면 된다.

그리고, 화면 UI 에 update 하는 건 반드시 handler안에 있어야 표현이 된다.

 

아래처럼 하면 된다.

 

public class MainList extends ListActivity {

 

 Handler handler = new Handler();
 protected static final int DIALOG_PROGRESS = 1;
 protected static final int MAX_PROGRESS = 100;
 ProgressDialog mProgressDialog = null;

 

//progress dialog의 핵심 함수


 @Override
 public Dialog onCreateDialog(int id) {
  switch (id) {
   case DIALOG_PROGRESS:
    mProgressDialog = new ProgressDialog(MainList.this); //현재의 클래스명으로 바꿔준다. "클래스명.this"
    mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mProgressDialog.setMessage("loading..");
    mProgressDialog.setCancelable(true);
    mProgressDialog.setMax(MAX_PROGRESS); // Max값 100
    return mProgressDialog;
   
  }
  return null;
 }

 

 @Override
 public void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.main);
  
  imgLib = new ImageLib();
  peopleList = new ArrayList();

 

  showDialog(DIALOG_PROGRESS); //프로그레스바 다이얼로그 온
  mProgressDialog.setProgress(0);
//
  new Thread() {
   public void run() {
    try {
     xmlParser();
     mProgressDialog.setProgress(100);
     
     //UI 관련 함수들은 아래 handler에서 호출해주어야만 화면에 적용이 된다.
     handler.post(new Runnable() {
      public void run() {
       // ..
       viewGo();
       
       dismissDialog(DIALOG_PROGRESS);
       mProgressDialog.dismiss();  
      }
     });
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }.start();
 }
 

 //Table 뿌리는 함수
 //Thread 내부에서는 쓸 수 없으므로, 따로 함수를 분리해서 호출해야 한다.


 public void viewGo(){
  setListAdapter(new IconicAdapter(this));
  selection = (TextView) findViewById(R.id.selection);
 }
 

 //xml 파싱하면서 프로그레스바 수치를 실시간으로 표시하기 위한 함수


 public void progressStatus(int total){
  mProgressDialog.setProgress(total);
 }

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://daehyub71.tistory.com/entry/AsyncTask-vs-Thread%EB%A1%9C%EC%9D%98-Progressbar%EA%B5%AC%ED%98%84-%EB%B9%84%EA%B5%90

 

AsyncTask는 이전 글인 [안드로이드]AsyncTask에 대하여...(전체소스포함) 에서 설명을 했으며 Thread에 대해서는 저의 다음블로그에서 자바 스레드(Threads)에 대해(http://blog.daum.net/dayhyub/56)에서 이야기를 했는데 기본적인 안드로이드 Thread의 이야기만 조금만 더 해보고 프로그래스바 구현 두개의 소스로 비교를 해보도록 하겠습니다.

Thread의 정의

● 프로세스보다 작은 단위이기 때문에 프로세스보다 가볍다.

● Thread는 서로의 자원을 공유하면서 동작한다.

● 한꺼번에 여러개의 작업을 동시에 실행할 때 사용된다.

Thread생성방법

● Thread클래스를 상속하는 방법

● Runnable인터페이스를 구현하는 방법

(1) Progressbar구현을 위해 함수 call방법비교

● Thread

1
startProgressBarThread2();

● AsyncTask

1
new ImageCallTask().execute(limgurl);
(2) Progressbar구현 사전 준비

● Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 막대형 진행상자//
public ProgressDialog progressDialog;
private volatile Thread theProgressBarThread2;
 
public synchronized void startProgressBarThread2() {
    if (theProgressBarThread2 == null) {
        theProgressBarThread2 = new Thread(null, backgroundTread2,
                "startProgressBarThread2");
        theProgressBarThread2.start();
 
        progressDialog = new ProgressDialog(act);
        progressDialog.setCanceledOnTouchOutside (false);
        progressDialog.setCancelable(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMessage("최신데이타로 업데이트중입니다.잠시만 기다리십시요 ...");
        progressDialog.incrementProgressBy(1);
        progressDialog.setMax(100);
        progressDialog.setProgress(0);
        progressDialog.show();
    }
}

● AsyncTask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private ProgressDialog dialog;
 
// 이곳에 포함된 code는 AsyncTask가 execute 되자 마자 UI 스레드에서 실행됨.
// 작업 시작을 UI에 표현하거나
// background 작업을 위한 ProgressBar를 보여 주는 등의 코드를 작성.
@Override
protected void onPreExecute() {
       // 작업을 시작하기 전 할일
    dialog = new ProgressDialog(DetailActivity.con);
    dialog.setTitle("이미지 다운로드중");
    dialog.setMessage("잠시만 기다리세요...");
    dialog.setIndeterminate(true);
    dialog.setCancelable(true);
    dialog.show();
                 
    super.onPreExecute();
}  
(3) Progressbar구현 작업

● Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private Runnable backgroundTread2 = new Runnable() {
    @Override
    public void run() {
        if (Thread.currentThread() == theProgressBarThread2) {
            int prate= (int)(100/AString.length);
            for(int i =0; i < AString.length;i++){
                DataInfo[] datainfo3 = new DataInfo[PublicCall.datacnt];
                String url="http://openapi.seoul.go.kr:8088/6461656879756232303536/xml/ListLostArticleService/1/"+DATACALL+"/"+AString[i];
                datainfo3 = PublicCall.publiccall(url,DATACALL);
                InsertCall.insertcall(datainfo3);
                //Log.d(TAG,"InsertCall :["+i+"]prate=["+prate+"]");
                if(i == (AString.length-1)) progressrate = 100;
                else progressrate = (int)(prate*(i+1));
                progressBarHandle2.sendMessage(progressBarHandle2
                        .obtainMessage());                 
            }  
        }
    }

● AsyncTask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
        @Override
protected Bitmap doInBackground(String... urls) {
    /* http://snowbora.com/417 참고
     * */
    final HttpClient client         = AndroidHttpClient.newInstance("Android");
    final HttpGet getRequest        = new HttpGet(urls[0]);
    final int IMAGE_MAX_SIZE        = 1280;
     
    try
    {
        HttpResponse response = client.execute(getRequest);
        final int statusCode = response.getStatusLine().getStatusCode();
         
        if (statusCode != HttpStatus.SC_OK)
        {
            return null;
        }
 
        final HttpEntity entity = response.getEntity();
         
        if (entity != null)
        {
            InputStream inputStream = null;
             
            try
            {
                inputStream = entity.getContent();
                 
                BitmapFactory.Options bfo   = new BitmapFactory.Options();
                bfo.inJustDecodeBounds      = true;
 
                BitmapFactory.decodeStream(new FlushedInputStream(inputStream), null, bfo);
                 
                if(bfo.outHeight * bfo.outWidth >= IMAGE_MAX_SIZE * IMAGE_MAX_SIZE)
                {
                    bfo.inSampleSize = (int)Math.pow(2, (int)Math.round(Math.log(IMAGE_MAX_SIZE / (double) Math.max(bfo.outHeight, bfo.outWidth)) / Math.log(0.5)));
                }
                bfo.inJustDecodeBounds = false;
                 
                response = client.execute(getRequest);
                final int nRetryStatusCode = response.getStatusLine().getStatusCode();
                 
                if (nRetryStatusCode != HttpStatus.SC_OK)
                {
                    return null;
                }
                 
                final HttpEntity reEntity = response.getEntity();
                 
                if (reEntity != null)
                {
                    InputStream reInputStream = null;
                     
                    try
                    {
                        reInputStream = reEntity.getContent();
                        final Bitmap imgBitmap = BitmapFactory.decodeStream(new FlushedInputStream(reInputStream), null, bfo);
                         
                        return imgBitmap;
                    }
                    finally
                    {
                         if (reInputStream != null)
                         {
                             reInputStream.close();
                         }
                          
                         reEntity.consumeContent();
                    }
                }
            }
            finally
            {
                if (inputStream != null)
                {
                    inputStream.close();
                }
                 
                entity.consumeContent();
            }
        }
    }
    catch (IOException e)
    {
        getRequest.abort();
    }
    catch (IllegalStateException e)
    {
        getRequest.abort();
    }
    catch (Exception e)
    {
        getRequest.abort();
    }
    finally
    {
        if ((client instanceof AndroidHttpClient))
        {
            ((AndroidHttpClient)client).close();
        }
    }
     
    return null;
     
}  
(4) Progressbar작업진행상태 표시

● Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Handler progressBarHandle2 = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                 
                progressDialog.setProgress(progressrate);
                progressDialog.setMessage("데이타를 저장중입니다.잠시만 기다리십시요 ..."
                        + progressrate + "%");
                if (progressrate == 100) {
                    stopProgressBarThread2();
                    datainfo = selectData();
                    appendRowFirst(datainfo);                  
                }
            }
        };

● AsyncTask

1
2
3
4
5
6
// onInBackground(...)에서 publishProgress(...)를 사용하면
        protected void onProgressUpdate(Integer... progress) {
            Log.d("LOST","onProgressUpdate:["+progress[0]+"]");
            dialog.setProgress(progress[0]);
        }
        
(5) Progressbar작업 완료 작업

● Thread

1
2
3
4
5
6
7
8
9
public synchronized void stopProgressBarThread2() {
        if (theProgressBarThread2 != null) {
            Thread tmpThread = theProgressBarThread2;
            theProgressBarThread2 = null;
            tmpThread.interrupt();
        }
        if (progressDialog != null)
            progressDialog.dismiss();
    }

● AsyncTask

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// onInBackground(...)가 완료되면 자동으로 실행되는 callback
        // 이곳에서 onInBackground가 리턴한 정보를 UI위젯에 표시 하는 등의 작업을 수행함.
        // (예제에서는 작업에 걸린 총 시간을 UI위젯 중 TextView에 표시함)
        @Override
        protected void onPostExecute(Bitmap imgBitmap) {
            if (imgBitmap != null)
            {
                imgView.setImageBitmap(imgBitmap);
                imgView.setVisibility(ImageView.VISIBLE);
                textview.setVisibility(TextView.GONE);
            }else{
                //textview = (TextView)findViewById(R.id.textView1);
                textview.setText("등록된 사진이 없습니다.");
                textview.setTextSize(20);
                textview.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
                textview.setVisibility(TextView.VISIBLE);
                imgView.setVisibility(ImageView.GONE);
            }
         
            dialog.dismiss();
        }
 
 

 

=================================

=================================

=================================

 

 

출차: http://gakari.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%A7%84%ED%96%89%EC%83%81%ED%99%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EC%8A%A4%EB%B0%94%EB%A1%9C-%EB%B3%B4%EC%97%AC%EC%A3%BC%EA%B8%B0

 

프로그래스 대화상자

 

프로그래스바가 있는 대화상자를 만들어봅시다.

 

 

xml은 위와 같습니다.

 

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"> <TextViewandroid:id="@+id/text"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="0"android:textSize="40sp"/><Buttonandroid:id="@+id/update"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="mOnClick"android:text="Update"/></LinearLayout>

 

 

 

자바파일.

 

package com.android.ex102;

 

import android.app.*;import android.content.*;import android.os.*;import android.view.*;import android.widget.*;

 

public class ex102 extends Activity {       int mValue;       TextView mText;       ProgressDialog mProgress;//프로그래스 대화상자 선언       boolean mQuit;

 

       public void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);             setContentView(R.layout.main);

 

             mText=(TextView)findViewById(R.id.text);       }             public void mOnClick(View v) {             mValue = 0;             showDialog(0);//프로그래스 대화상자 보여주는 부분             mQuit = false;             mHandler.sendEmptyMessage(0);       }

 

       //프로그래스 대화상자를 만드는 부분       protected Dialog onCreateDialog(int id) {             switch (id) {             case 0:                    mProgress = new ProgressDialog(this);                    mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//프로그래스바 모양을 막대모양으로                                       mProgress.setTitle("Updating");//타이틀                    mProgress.setMessage("Wait...");//메시지                    mProgress.setCancelable(false);//back버튼으로 닫을수 없게함                                       //버튼이름과 리스너를 달아줌                    mProgress.setButton("Cancel"new DialogInterface.OnClickListener() {                           public void onClick(DialogInterface dialog, int whichButton) {                                 mQuit = true;                                 dismissDialog(0);//대화상자를 없앤다                           }                    });                    return mProgress;             }             return null;       }

 

       Handler mHandler = new Handler() {             public void handleMessage(Message msg) {                    mValue++;                    mText.setText(Integer.toString(mValue));                    try {                           Thread.sleep(50); //50ms 멈춤                           }                    catch (InterruptedException e) {;}                                       if (mValue < 100 && mQuit == false) {                           mProgress.setProgress(mValue);//프로그래스값을 바꿈                           mHandler.sendEmptyMessage(0);//메시지를 보냄                    } else {                           dismissDialog(0);//다이얼로그를 없앰                    }             }       };

}

 

 

 

 

 

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://namsieon.com/314

 

안드로이드의 다이얼로그에 대한 내용입니다.


Progress Dialog 생성하기


 

 


프로그레스 다이얼로그 ( Progress Dialog ) 는 AlertDialog 클래스를 상속받은 클래스 입니다. 이것은 끝나는 시점이 명확하지 않은 상태의 태스크에 대한 진행상황을 '진행바퀴' 로 보여줍니다.

끝나는 시점이 정해진 태스크라면 좀 더 명확하게 '진행바' 로 보여주는것도 좋겠네요

이 다이얼로그는 버튼을 제공할 수도 있습니다. ProgressDialog 의 구현은 ProgressDialog.show() 메소드를 호출하는 것만으로 처리할 수 있습니다.


show() 메소드는 모두 static 메소드라는 점에 주의하시면 되겠습니다.

 


 

  ProgressDialog dialog = ProgressDialog.show(AndroidTest.this, "",
  "로딩 중입니다. 잠시 기다려주세요", true);
view rawgistfile1.java hosted with ❤ by GitHub






show() 메소드의 첫번째 인자는 어플리케이션의 컨텍스트, 두번재는 다이얼로그 타이틀, 세번째는 텍스트 내용, 네번째는 '진행바'에서 사용되는 루프 진행 여부를 나타냅니다.

프로그레스 다이얼로그의 디폴트 스타일은 '진행바퀴' 입니다.


진행바 표시하기


 

 



명확한 진행율을 보여주는 진행바를 만들기 위해선 아래와 같은 방법을 일반적으로 사용합니다.

1. 생성자인 ProgressDialog(Context context) 로 초기화 합니다.
2. 진행 스타일을 setProgressStyle() 메소드에 "STYLE_xxx" 로 지정하고 그외 속성들을 지정합니다
3. 다이얼로그 표시를 위해 show() 메소드를 호출 하거나, onCreateDialog() 에서 ProgressDialog 객체를 리턴해도 됩니다.
4. 전체 값을 setProgress() 로 지정하거나 incrementProgressBy(int) 메소드로 현재 진행양에 증가분 값을 더할 수 있습니다.



 

 

  ProgressDialog progressDialog;
  progressDialog = new ProgressDialog(AndroidTest.this);
  progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progressDialog.setMessage("로딩중입니다...");
  progressDialog.setCancelable(false);
  progressDialog.show();
view rawgistfile1.java hosted with ❤ by GitHub



 


직접 소스코드를 테스트 해보시는 분들도 계시겠지만, 직접 테스트해보면 다이얼로그가 시작되면 그 다이얼로그가 끝나서 종료되어 끝나기 전에는 해당 액티비티에서 "BACK" 버튼을 눌러도 반응을 하지 않습니다.

진행상태라는것의 특성상 어떤 진행 상태는 오래걸릴수도 있고 다른 기타 이유들 때문에 별도의 스레드에서 처리하고 , 메인 스레드는 계속 사용자에게 즉각 반응을 해야되는데요, 이 작업을 위해선 스레드를 새로 생성 후 핸들러를 이용하여 메인스레드에게 결과를 알려주는 방식을 써야 합니다.


별도의 스레드에서 ProgressBar 구현


진행상태 표시와 처리를 위하여 , 별도의 스레드를 만들고 그 스레드는 진행이 이루어질 때 마다 핸들러를 통해 메인 스레드로 알려주면 됩니다. 그러면 메인 액티비티에서 Progress 다이얼로그를 업데이트하게 하면 되겠지요.

 


 

  package exam.androidtest;
   
  import android.app.Activity;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.os.Bundle;
  import android.os.Handler;
  import android.os.Message;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
   
  public class NotificationTest extends Activity {
  static final int PROGRESS_DIALOG = 0;
  Button button;
  ProgressThread progressThread;
  ProgressDialog progressDialog;
   
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
   
  button = (Button) findViewById(R.id.btn);
  button.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {
  showDialog(PROGRESS_DIALOG);
  }
  });
  }
   
  protected Dialog onCreateDialog(int id) {
  switch (id) {
  case PROGRESS_DIALOG:
  progressDialog = new ProgressDialog(NotificationTest.this);
  progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progressDialog.setMessage("Loading...");
  progressThread = new ProgressThread(handler);
  progressThread.start();
  return progressDialog;
  default:
  return null;
  }
  }
   
  // 핸들러는 정의하여 스레드가 메시지를 보내면 프로그레스를 업데이트 합니다.
  final Handler handler = new Handler() {
  public void handleMessage(Message msg) {
  int total = msg.getData().getInt("total");
   
  progressDialog.setProgress(total);
  if (total >= 100) {
  dismissDialog(PROGRESS_DIALOG);
  progressThread.setState(ProgressThread.STATE_DONE);
  }
  }
  };
   
  /** 프로그레스를 처리하는 클래스를 내부 클래스로 정의. */
  private class ProgressThread extends Thread {
  Handler mHandler;
  final static int STATE_DONE = 0;
  final static int STATE_RUNNING = 1;
  int mState;
  int total;
   
  ProgressThread(Handler h) {
  mHandler = h;
  }
   
  public void run() {
  mState = STATE_RUNNING;
  total = 0;
  while (mState == STATE_RUNNING) {
  try {
  Thread.sleep(100);
  } catch (InterruptedException e) {
  // 에러처리
  }
  Message msg = mHandler.obtainMessage();
  Bundle b = new Bundle();
  b.putInt("total", total);
  msg.setData(b);
  mHandler.sendMessage(msg);
  total++;
  }
  }
   
  // 현재의 상태를 설정하는 메소드
  public void setState(int state) {
  mState = state;
  }
  }
  }
view rawgistfile1.java hosted with ❤ by GitHub



 


  
다이얼 로그에 대한 내용이 거의 끝나갑니다.

다음 포스팅에선 커스텀 다이얼로그의 생성을 알아보겟습니다. 

 

 

 

=================================

=================================

=================================

 

 

 

출처: http://mainia.tistory.com/2031

 

 

앱에서 시간이 걸리는 작업을 진행할 때ProgressDialog 로 진행정도를 사용자에게 알립니다그리고 진행이 다 끝나면 종료하게 되죠. ProgressDialog 는 두가지 종류가 있습니다스핀과 진행정도를 나타내는 바 형태의 다이얼로그가 있죠.

 

▼ 먼저 스핀 ProgressDialog 입니다스핀은 진행과정을 표시하지는 않고 계속해서 돌아가는 그림만 보여주죠. ProgressDialog  setProgressStyle() 함수에ProgressDialog.STYLE_SPINNER 옵션을 넘기시고 setMessage() 에 표현하고 싶은 메시지를 입력합니다마지막으로 다이얼로그를 띄우기 위해 show() 함수를 호출합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
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 종료 기능을 구현합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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 입력하시면 됩니다그리고 나머지 셋팅은동일하죠.

 

1
2
3
4
5
6
7
8
9
10
11
12
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() 함수를 셋팅해 주시면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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 와 함께 어떤식으로 사용하는지 알아 보았습니다.

 

 

 

 

 

=================================

=================================

=================================

 

 

 

반응형