안녕하세요...

 

xml 파싱 관련 질문 드립니다..

 

현재 아래 코드와 같이 xml 파싱을 하고 있는데요...

맨첨에는 insert 부분 때문에 느린줄 알았으나.. xml 파싱 문제 였습니다.

 

현재 데이터가 2만8천개 (고정적이진 않지만 평균적인 갯 수 입니다.) 의 데이터를 xml 로 파싱 하여 가지고 오는데요

실질상 xml 연동 시작 되는 부분은 그렇게 느리지 않는것 같습니다.

 

하지만 items라는 배열 변수에 데이터를 넣어 주기 위해서 xml 태그를 체크하는데요 그부분에서 시간이 많이 걸립니다..

현재 안드로이드가 아닌 자바로 테스트 했을때는 굉장히 빠른데..

안드로이드로 옮겨 놓으니 저렇게 말썽을 부립니다...

 

어떻게해야 좋을지 모르겠습니다.. ㅜㅜ 핸드폰에 옮겼더니... xml 파싱 하다가 어플이 죽어버리네요 ㅜㅜㅜ

 

 public void goStart(){
   try {
    db = DBHandler.open(this);
 URL url = new URL("http://www.*****.com/external/****_firstxml.php?code=%@);
 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
 XmlPullParser parser = factory.newPullParser();
 parser.setInput(url.openStream(), "utf-8");
 
 /* DB 업데이트  */
 
 boolean setResult = false;
 
 int eventType = parser.getEventType();
 
 int i = 0;
 String tag = "";
 Item item = null;
 while(eventType != XmlPullParser.END_DOCUMENT){
  switch (eventType) {
  case XmlPullParser.START_DOCUMENT:
   break;
  case XmlPullParser.END_DOCUMENT:
   break;
  case XmlPullParser.START_TAG:
   tag = parser.getName();
   setResult = true;
   break;
  case XmlPullParser.END_TAG:
   if(tag.equals("distance")){
    items.add(item);
    tag = "";
   }
   break;
  case XmlPullParser.TEXT:
   if (setResult) {
    if (tag.equals("ID")) {
     item = new Item();
     item.setID(parser.getText().trim());
    } else if (tag.equals("couponID")) {
     item.setCouponID(parser.getText().trim());
    } else if (tag.equals("shopID")) {
     item.setShopID(parser.getText().trim());
    } else if (tag.equals("shopname")) {
     item.setShopname(parser.getText().trim());
    } else if (tag.equals("shopmaplat")) {
     item.setShopmaplat(parser.getText().trim());
    } else if (tag.equals("shopmaplng")) {
     item.setShopmaplng(parser.getText().trim());
    } else if (tag.equals("shopcategory")) {
     item.setShopcategory(parser.getText().trim());
    } else if (tag.equals("coupontitle")) {
     item.setCoupontitle(parser.getText().trim());
    } else if (tag.equals("couponsaleprice")) {
     item.setCouponsaleprice(parser.getText().trim());
    } else if (tag.equals("couponbuyend")) {
     item.setCouponbuyend(parser.getText().trim());
    } else if (tag.equals("distance")) {
     item.setDistance(parser.getText().trim());
    }
   }
   setResult = false;
   break;
  default:
   break;
  }
  eventType = parser.next();
 }
 /* 매장 ZSHOP을 제외한 나머지는 데이터 초기화  */
 db.delete("ZCOUPON");
 db.delete("ZRELATION");
} catch (Exception e) {
 // TODO: handle exception
 Toast.makeText(this, e.getMessage(), 0).show();
}

for (Item item: items) {
 /* 새로 받은 데이터 저장 */
 db.insertZCOUPON("ZCOUPON", item.getID(), item.getCoupontitle(), item.getCouponsaleprice(), item.getCouponbuyend(), item.getDistance());
 db.insertZRELATION("ZRELATION", item.getID(), item.getCouponID(), item.getShopID());
 
 /* 매장 정보 조회 */
 cr = db.findCnt("ZSHOP", item.getShopID());
 startManagingCursor(cr);
 shop_count = cr.getCount();
 
 /* 이미 매장이 있을 경우 저장 X 없는 경우만  */
  db.insertZSHOP("ZSHOP", item.getID(), item.getShopname(), item.getShopmaplat(), item.getShopmaplng(), item.getShopcategory(), item.getDistance());
  /*Log.v("Show Xml Data Parsing Value", 
   "ID : " + item.getID() 
   + ", couponID : " + item.getCouponID()
   + ", shopID : " + item.getShopID()
   + ", shopname : " + item.getShopname()
   + ", shopmaplat : " + item.getShopmaplat()
   + ", shopmaplng : " + item.getShopmaplng()
   + ", shopcategory : " + item.getShopcategory()
   + ", coupontitle : " + item.getCoupontitle()
   + ", couponsaleprice : " + item.getCouponsaleprice()
   + ", couponbuyend : " + item.getCouponbuyend()
   + ", distance : " + item.getDistance()
 );*/
}
listData();
  }