=================================
=================================
=================================
출처: 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
=================================
=================================
=================================
출차: 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 메소드라는 점에 주의하시면 되겠습니다.
show() 메소드의 첫번째 인자는 어플리케이션의 컨텍스트, 두번재는 다이얼로그 타이틀, 세번째는 텍스트 내용, 네번째는 '진행바'에서 사용되는 루프 진행 여부를 나타냅니다.
프로그레스 다이얼로그의 디폴트 스타일은 '진행바퀴' 입니다.
진행바 표시하기
명확한 진행율을 보여주는 진행바를 만들기 위해선 아래와 같은 방법을 일반적으로 사용합니다.
1. 생성자인 ProgressDialog(Context context) 로 초기화 합니다.
2. 진행 스타일을 setProgressStyle() 메소드에 "STYLE_xxx" 로 지정하고 그외 속성들을 지정합니다
3. 다이얼로그 표시를 위해 show() 메소드를 호출 하거나, onCreateDialog() 에서 ProgressDialog 객체를 리턴해도 됩니다.
4. 전체 값을 setProgress() 로 지정하거나 incrementProgressBy(int) 메소드로 현재 진행양에 증가분 값을 더할 수 있습니다.
직접 소스코드를 테스트 해보시는 분들도 계시겠지만, 직접 테스트해보면 다이얼로그가 시작되면 그 다이얼로그가 끝나서 종료되어 끝나기 전에는 해당 액티비티에서 "BACK" 버튼을 눌러도 반응을 하지 않습니다.
진행상태라는것의 특성상 어떤 진행 상태는 오래걸릴수도 있고 다른 기타 이유들 때문에 별도의 스레드에서 처리하고 , 메인 스레드는 계속 사용자에게 즉각 반응을 해야되는데요, 이 작업을 위해선 스레드를 새로 생성 후 핸들러를 이용하여 메인스레드에게 결과를 알려주는 방식을 써야 합니다.
별도의 스레드에서 ProgressBar 구현
진행상태 표시와 처리를 위하여 , 별도의 스레드를 만들고 그 스레드는 진행이 이루어질 때 마다 핸들러를 통해 메인 스레드로 알려주면 됩니다. 그러면 메인 액티비티에서 Progress 다이얼로그를 업데이트하게 하면 되겠지요.
다이얼 로그에 대한 내용이 거의 끝나갑니다.
다음 포스팅에선 커스텀 다이얼로그의 생성을 알아보겟습니다. ㅎ
=================================
=================================
=================================
출처: 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 와 함께 어떤식으로 사용하는지 알아 보았습니다.
=================================
=================================
=================================