//onPreExecute 함수는 이름대로 excute()로 실행 시 doInBackground() 실행 전에 호출되는 함수
//여기서 ProgressDialog 생성 및 기본 세팅하고 show()
@Override
protected void onPreExecute() {
mProgress = new ProgressDialog(mContext);
mProgress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgress.setMessage("로딩중입니다.");
mProgress.show();
//ProgressDialog dialog = ProgressDialog.show(mContext,"", "로딩중입니다 잠시만 기달려주세요.", true);
super.onPreExecute();
}
..........................................................................
@Override
protected Integer doInBackground(Integer... params) {
final int taskCnt = params[0];
//넘겨받은 작업개수를 ProgressDialog의 맥스값으로 세팅하기 위해 publishProgress()로 데이터를 넘겨준다
publishProgress("max", Integer.toString(taskCnt));
try {
//작업 진행, 여기선 넘겨준 작업개수 * 100 만큼 sleep() 걸어줌
Thread.sleep(100);
//안드로이드에서 xml문서를 읽고 파싱하는 객체를 선언
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//네임스페이스 사용여부
factory.setNamespaceAware(true);
//실제 sax형태로 데이터를 파싱하는 객체 선언
XmlPullParser xpp = factory.newPullParser();
//웹사이트에 접속
url = new URL(uri);
//웹사이트를 통해서 읽어드린 xml문서를 안드로이드에 저장
InputStream in = url.openStream();
//xml문서를 일고 파싱하는 객체에 넘겨줌
xpp.setInput(in,"UTF-8"); //xml문서의 인코딩 정확히 지정
//item 태그를 안이라면
boolean isInItemTag = false;
//이벤트 타입을 얻어옴
int eventType = xpp.getEventType();
//문서의 끝까지 읽어 드리면서 lstPrdtNm과 lstPlaceripton을 추출해냄
while(eventType != XmlPullParser.END_DOCUMENT){
if(eventType==XmlPullParser.START_TAG){
//태그명을 읽어드림
tagname = xpp.getName();
if(tagname.equals("item")){
isInItemTag = true;
}
}else if(eventType==XmlPullParser.TEXT){
//태그명이 lstPrdtNm이거나 또는 lstPlaceription일때 읽어옴
if(atcId.equals("atcId")&&isInItemTag){
atcId += xpp.getText();//text에 해당하는 모든 텍스트를 읽어드림 ( += )
}else if(tagname.equals("prdtClNm")&&isInItemTag){
prdtClNm += xpp.getText();
}else if(tagname.equals("lstPrdtNm")&&isInItemTag){
lstPrdtNm += xpp.getText();
}else if(tagname.equals("lstSbjt")&&isInItemTag){
lstSbjt += xpp.getText();
}else if(tagname.equals("lstPlace")&&isInItemTag){
lstPlace += xpp.getText();
}else if(tagname.equals("lstYmd")&&isInItemTag){
lstYmd += xpp.getText();
}
}else if(eventType==XmlPullParser.END_TAG){
//태그명을 읽어드림
tagname = xpp.getName();
//endtag일경우에만 벡터에 저장
if(tagname.equals("item")){
//벡터에 저장
atcIdVec.add(atcId);
prdtClNmVec.add(prdtClNm);
lstPrdtNmVec.add(lstPrdtNm);
lstSbjtVec.add(lstSbjt);
lstPlaceVec.add(lstPlace);
lstYmdVec.add(lstYmd);
TitleVec.add( "<물품명>"+lstSbjt + "/ ( 날짜 :"+ lstYmd +")" );
//변수 초기화
atcId="";
prdtClNm="";
lstPlace="";
lstSbjt="";
lstPrdtNm="";
lstYmd="";
isInItemTag = true;
}//if-------
}//if----------
//다음 이벤트 다입을 저장
eventType = xpp.next();
//작업이 진행되면서 호출하며 화면의 업그레이드를 담당.
publishProgress("progress", Integer.toString(eventType) , "로딩중 " + Integer.toString(eventType) + " %");
}//while---------
//모든 데이터가 저장되었다면.
flag=true; //true : 지정된 xml파일을 읽고 필요한 데이터를 추출해서 저장 완료된 상태
} catch (Exception e) {
e.printStackTrace();
}
//수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate의 파라미터가 된다.
return taskCnt;
}//doInBackground()------------
//onProgressUpdate() 함수는 publishProgress() 함수로 넘겨준 데이터들을 받아옴
@Override
protected void onProgressUpdate(String... progress) {
if (progress[0].equals("progress")) {
mProgress.setProgress(Integer.parseInt(progress[1]));
mProgress.setMessage(progress[2]);
}
else if (progress[0].equals("max")) {
mProgress.setMax(Integer.parseInt(progress[1]));
}
}
AsyncTask 를 이용해서 서버에서 XML데이터를 불러와 보여줄려고 합니다.
서버에서 데이터를 불러오는 속도가 느려서 AynscTask내에서 백그라운드에서 데이터처리
를 하기전에 OnPreExcute 내에서 UI단에 Progress Dialog 를 이용하여 로딩 진행률을 보여주게 하였습니다.
그런데 해당 프로그램을 실행을 시키면 한참동안 서버에서 데이터를 볼러오고 UI단에 데이터를 리스트형식으로 보여준 후에야 Progress Dialog 가 생성된고 진행률도 1%밖에 안됍니다..
어떻게 해결해야 할지 선생님들의 도움을 요청드립니다..