안드로이드 개발 질문/답변
(글 수 45,052)
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId()==R.id.button1){
XmlPullParserFactory factory;
XmlPullParser parser;
URL xmlUrl=null;
boolean flag1 = false;
boolean flag2 = false;
boolean flag3 = false;
boolean flag4 = false;
boolean flag5 = false;
boolean flag6 = false;
tv.setText("apply");
try{
tv.setText("trycatch");
String url = "http://000000000000000";
tv.setText("url");
xmlUrl = new URL("url);
factory = XmlPullParserFactory.newInstance();
tv.setText("factory");
parser = factory.newPullParser();
tv.setText("newPull"); // 여기까지 진행
InputStream in = xmlUrl.openStream(); // 진행이 되지 않는 부분 시작
tv.setText("Inputstream");
parser.setInput(in,"euc-kr");
tv.setText("setinput");
int eventType= parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
tv.setText("while");
switch (eventType){
case XmlPullParser.START_DOCUMENT:
tv.setText("start_document"); // 갤럭시플레이어 여기까지 진행
break;
case XmlPullParser.END_DOCUMENT:
tv.setText("end_document");
break;
case XmlPullParser.START_TAG:
tv.setText("start_tag");
if(parser.getName().equals("board")){
if(parser.getName().equals("alpha")){
flag1=true;
tv.append("==========");
if(parser.getName().equals("num")){
flag2=true;
}
else if(parser.getName().equals("writer")){
flag3=true;
}
else if(parser.getName().equals("conent")){
flag4=true;
}
else if(parser.getName().equals("wdate")){
flag5=true;
}
else if(parser.getName().equals("count")){
flag6=true;
}
}
}
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.TEXT:
if(flag2){
tv.append("num : "+parser.getText());
flag2=false;
}
else if(flag3){
tv.append("writer : "+parser.getText());
flag3=false;
}
else if(flag4){
tv.append("content : "+parser.getText());
flag4=false;
}
else if(flag5){
tv.append("wdate : "+parser.getText());
flag5=false;
}
else if(flag6){
tv.append("count : "+parser.getText());
flag6=false;
}
break;
}
eventType = parser.next();
if(!(tv.getText().toString().equals(""))){
break;
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
위와 같이 소스를 구현하였습니다.
문법상으로는 맞는거 같은데 (일단 eclipse자체에서 오류는 뜨지 않습니다.ㅠ)
계속 되질 않아서 settext를 통해 코드가 진행될때마다 text가 바뀌도록 설정해두고, 차근차근 보았습니다.
(실행 단말기는 삼성 갤럭시플레이어 2.2 / 삼성 갤투 skt 4.0.4 / android avd 2.2 / 2.3.3)
삼성 갤럭시플레이어 2.2에서는 while까지만 진행되고, 그 이상은 진행되질 않습니다. ㅠㅠ(와이파이를 연결한 상태임에도..)
더불어 다른 단말기에서는 newpull까지 (즉, openstream 진입이 안됩니다.) 출력이 되고 있습니다.
하... 이 부분을 어찌해야 할까요. 구글링을 계속 해 보아도 별다른 성과도 없고, logcat을 보아도 영...ㅠㅠ
(httpConnection이라고 뜨긴 하지만 대체 왜 뜨는지 이유자체도 보이지 않습니다. 퍼미션이라는데 퍼미션을 준지는 오래...ㅠㅠ)
고수님들의 도움을 부탁드리겠습니다.ㅠㅠ
XML파일의 구조입니다.
<board>
</board>
겨우 예제 하나를 성공한거 같긴 합니다만.. (그대로 복붙)
중요한건 갤투 4.0.4 에서는 에러가 그대로 나고.. Error in network call 이네요.
갤럭시플레이어 2.2 에서는 성공적으로 예제가 돌아가네요..
뭔가 바뀐건지..;;;




자문자답입니다.
AsyncTask를 통하여 처리하였습니다.
ICS에서 부터는 시간이 오래 걸리는 작업에 대하여 Background로 처리를 유도하게끔 한다고 하더라구요.
그렇기 때문에 Network 관련 작업들은 AsyncTask를 사용하거나, 별도의 Thread를 만들어 돌려야 한다는거....
(근데 일단 이런식으로 처리를 하고 나니 Data를 받아오는 속도가 느리더라도 당장에 화면이 돌아가는것이 보이니 User 입장에서는 훨씬 빠르게 느껴지네요.)