안녕하세요 지금 파싱을 하여 db에 넣는 작업중에 문제가 생겨 문의 드립니다.
예를 들어 5군데의 site를 xml파싱을 하여 결과를 local db에 넣는 작업입니다.
앱 시작과 동시에 작업을 시작하게 하였는데 테스트 과정으로 개발한
new Thread(new Runnable() {
public void run() { } }.start()
저런 식으로 5개를 연달아 만들어서 작업을 하면 정상적으로 작업이 진행 합니다.
하지만 해당 작업을 asynctask로 5개 만들거나 위의 소스의 끝나기 전 부분에 다시 파싱과 db insert과정을
거칠 경우 랜덤하게 작업을 완료하지 못하고 있습니다.
부디 해결책 아시는 분 도움 부탁드립니다.
아래에 제가 실제 사용한 코드인데 아래와 같은 코드를 xml파싱 주소만 바꿔서 5개를 하도록 한 부분입니다.
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
String xmlDataDbGame = "xxxxxxxxxxxxx=";
String xmlGameTabelData = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String enCoderGame = URLEncoder.encode(xmlGameTabelData);
try {
URL xmlUrlGame = new URL("serAddr+xmlDataDbGame+enCoderGame);
pars(xmlUrlGame);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
private void pars(URL xmlUrlGame) {
XmlPullParserFactory xp;
try {
xp = XmlPullParserFactory.newInstance();
XmlPullParser pr = xp.newPullParser();
try {
pr.setInput(xmlUrlGame.openStream(), "utf-8");
boolean flag = false;
String sTag;
try {
int eventType = pr.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.END_DOCUMENT:
break;
case XmlPullParser.START_TAG:
sTag = pr.getName();
if(sTag.equals("vector")){
flag = true;
}
if(flag){
if(sTag.equals("data vectorkey")){
String sValue = pr.getAttributeValue(0);
}
else if(sTag.equals("game_id")){
String gameId = pr.getAttributeValue(0);
gtgameid.add(gameId);
}else if(sTag.equals("game_name")){
String gameName = pr.getAttributeValue(0);
gtgamename.add(gameName);
}else if(sTag.equals("game_nick")){
String gameNick = pr.getAttributeValue(0);
gtgamenick.add(gameNick);
}else if(sTag.equals("service_yn")){
String serviceYn = pr.getAttributeValue(0);
gtserviceyn.add(serviceYn);
}
}
break;
case XmlPullParser.END_TAG:
sTag = pr.getName();
if(sTag.equals("vector")){
flag = false;
}
break;
case XmlPullParser.TEXT:
break;
}
try {
eventType = pr.next();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int loop = 0; loop < gtgameid.size(); loop++){
gameDb.add(new MapList(gtgameid.get(loop), gtgamename.get(loop), gtgamenick.get(loop), gtserviceyn.get(loop)));
mDbOpenHelper.insertColumnGame(gtgameid.get(loop), gtgamename.get(loop), gtgamenick.get(loop), gtserviceyn.get(loop));
}
}
}).start();
위와 같은 부분을 5개 시작하는데 다른 방법이 없는지 문의 드립니다.




사견입니다만,
5개의 다른 리소스를 1개의 DB에 동시에 넣으려고 하기 때문에
비동기식 작업방식은 어울리지 않는다고 생각합니다.
Thread를 돌리고 synchronized를 이용하시는게 맞는 것 같습니다.
물론 Thread에 대한 식견이 짧기 때문에 아닐 수도 있구요 =_=;;