Progressbar

2012. 5. 15. 09:46
Progress Dialog 생성하기


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

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

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


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


    ProgressDialog dialog = ProgressDialog.show(AndroidTest.this, "",
    "로딩 중입니다. 잠시 기다려주세요", true);





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();


 


직접 소스코드를 테스트 해보시는 분들도 계시겠지만, 직접 테스트해보면 다이얼로그가 시작되면 그 다이얼로그가 끝나서 종료되어 끝나기 전에는 해당 액티비티에서 "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;
}
}
}





AsyncTask 를 이용한 프로그레스바 추가.java


package kr.or.ddit;

import java.security.PublicKey;
import java.util.ArrayList;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskProgressbarActivity extends Activity {

    ProgressBar bar;
    TextView textView;
    Handler handler;
    AsyncTaskProgress task;
    int cnt=0;
    float fileSize = 1024;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ArrayList<String> list = new ArrayList<String>();
       
        bar = (ProgressBar) findViewById(R.id.progressbar);
        bar.setMax(100);
        textView= (TextView) findViewById(R.id.textView);
     
        Button startBtn = (Button) findViewById(R.id.startBtn);
        startBtn.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View arg0) {
            task = new AsyncTaskProgress();
            task.execute(fileSize);
            }
        });
        Button cancelBtn = (Button) findViewById(R.id.cancelBtn);
        cancelBtn.setOnClickListener(new OnClickListener() {
           
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                task.cancel(true);
            }
        });
    }
    class AsyncTaskProgress extends AsyncTask<Float, Integer, Integer>{

        @Override
        protected void onPreExecute() {
            cnt=0;
            bar.setProgress(0);
            textView.setText("push ple download");
        }
        @Override
        protected Integer doInBackground(Float... value) {
            while (!isCancelled()) {
                if(cnt>value[0]){
                    break;
                }else {
                    publishProgress(cnt);
                }
               
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                cnt++;
            }
            return cnt;
       
        }
        @Override
        protected void onProgressUpdate(Integer... integers) {
            //bar.incrementProgressBy(integers[0].intValue());
            bar.setProgress((int) (integers[0].floatValue()/fileSize*100));
            textView.setText((int)(integers[0].floatValue()/fileSize*100)+"% down loading.. ");
        }
        @Override
        protected void onPostExecute(Integer result) {
            bar.setProgress(0);
            textView.setText("down loading compleate!");
           
        }
       
        @Override
        protected void onCancelled() {
            bar.setProgress(0);
            textView.setText("down load cancel");
        }
    }
   

}

'안드로이드' 카테고리의 다른 글

소켓 통신 구현  (0) 2012.05.15
You must supply a layout_width attribute  (0) 2012.05.15
안드로이드 색상표  (0) 2012.05.11
안드로이드 강좌 모음 pdf&동영상 강좌.  (0) 2012.05.11
화면회전  (0) 2012.05.08
Posted by 사라링
BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :