마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask를 이용할때 ProgressDialog 진행률 표시 도움부탁드립니다.

0 추천
 //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%밖에 안됍니다..

어떻게 해결해야 할지 선생님들의 도움을 요청드립니다..

 

 

 

 

 

 

 

선량한하늘 (120 포인트) 님이 2014년 5월 7일 질문

1개의 답변

0 추천
url = new URL(uri);
//웹사이트를 통해서 읽어드린 xml문서를 안드로이드에 저장
InputStream in = url.openStream();
//xml문서를 일고 파싱하는 객체에 넘겨줌
xpp.setInput(in,"UTF-8"); //xml문서의 인코딩 정확히 지정

이부분에서 걸리는 시간이 이 코드 아랫부분에서 데이터를 파싱할 때보다 100배는 더 많이 걸리기 때문이죠;;;

xpp.setInput() 메소드에서 url로 연결되는 xml 파일을 불러오는 부분의 소스도 수정가능하다면 callback 인터페이스등을 구현하여 처리하면 되겠지만.. 괜히 일이 커지는군요...;;

dante2k (8,390 포인트) 님이 2014년 5월 8일 답변
dante2k 선생님 답변 감사합니다.
선생님 말씀대로 callBack 인터페이스 구현을 혼자 학습해나가면서 끙끙해매면은 할수있을거 같습니다.

그런데 설명이 정의되어있는데로 실행되는 onPreExcute에서 Progress 가 UI단에 먼저 실행되는게 아니라

DoInBackground 메소드에서 XML 파싱이 다 완료된다음에 리스트뷰에 뿌려질떄 같이 뿌려집니다..

왜 Progress 진행바가 UI단에 최초에 보여지는게 아니라 백그라운드 XML 파싱작업이 다 끝난다음에 보여지는지 모르겠습니다..

이게 제일 문제에요 선생님 progressbar 가 XML파싱이 다끝나고 데이터들이  view에 출력될떄 같이 출력이 돼요..
dante2k 선생님 간절히 도움 부탁드립니다...
...