우리는 XML 파일을 구문 분석하고 그에 따라 내용을 표시하기 위해 다음과 같은 방법이 있습니다 (방법을이상한 행동
@Background
@AfterInject
void parseXMLAndLoadContent() {
try {
URL url = new URL(URI);
xmlParser.setInput((InputStream) url.getContent());
showProgressDialog();
angeboteXML = xmlParser.parse();
if (angeboteXML != null) { // Breakpoint here
if (angeboteXML.backgroundImage != "") {
loadBitmapFromUrl(angeboteXML.backgroundImage);
}
loadAngebote();
} else
throw new Exception();
} catch (Exception exception) {
showToast();
} finally {
dismissProgressDialog();
}
}
을 당신이 그것을가 진행 대화 상자를 표시하도록되어 볼 수 있듯이을 @UiThread
으로 주석 됨). 그런 다음 XML 구문 분석기를 호출하고 결과를 처리합니다.
불행히도, 위의 줄에 parse()
을 호출 한 직후에 중단 점을 설정할 때만 작동합니다. 여하튼, 이것은 파서가 문서를 다루는 것을 허용하는 일정한 유예 기간을 가져온다. 방금 중단 점없이 실행하게하면 아무 일도 일어나지 않고 진행 대화 상자가 표시되지 않고 angeboteXML
이 null이 아닙니다.
저는 Android 전문가가 아니기 때문에 - 왜 이런 일이 일어나고 개선할만한 것이 있습니까? 필자가 이해하는 한, 이것은 순차적으로 실행되어야한다. 즉, 파서가 파싱을 마친 후에는 다른 모든 것들이 실행된다. 그러나 이것은 어떻게 든 여기의 경우가 아닙니다.
편집 16/05/13 13시 21분하십시오 Thread.sleep(1000)
parse()
후 추가는
할 수 있지만, 더 수정보다 해결 방법처럼 보인다. 파서가 아직 완료되지 것 같다 때문에 NPE가 발생되는 경우
05-16 13:19:26.168: I/AngeboteActivity(6051): Entering [void parseXMLAndLoadContent() ]
05-16 13:19:26.278: I/AngeboteXMLParser(6051): Entering [public de.sample.app.helper.AngeboteXML parse() throws org.xmlpull.v1.XmlPullParserException, java.io.IOException]
05-16 13:19:26.318: I/AngeboteXMLParser(6051): Exiting [public de.sample.app.helper.AngeboteXML parse() throws org.xmlpull.v1.XmlPullParserException, java.io.IOException], duration in ms: 35
05-16 13:19:26.318: I/AngeboteActivity(6051): Exiting [void parseXMLAndLoadContent() ], duration in ms: 147
05-16 13:19:26.318: I/AngeboteActivity(6051): Entering [void loadAngebote() ]
loadAngebote()
입니다 :
이 메소드 실행의 추적 로그입니다.
편집 16/05/13 13시 29분
이것은 parse()
방법을 구현하는 방법입니다
public AngeboteXML parse() throws XmlPullParserException, IOException {
this.xml = new AngeboteXML();
int eventType = this.parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG :
this.readStartTag(this.parser.getName());
break;
case XmlPullParser.END_TAG :
this.readEndTag(this.parser.getName());
break;
case XmlPullParser.TEXT :
this.readText(this.parser.getText());
break;
default :
break;
}
this.parser.next();
eventType = this.parser.getEventType();
}
return xml;
}
그냥 알아 냈습니다 :'parse()'를 호출 한 후에'Thread.sleep (1000)'을 추가하면 도움이됩니다. 아직도 이것을 이해하지 못합니다. –
어떤 XML 파서 구현을 사용하고 있습니까? –
'org.xmlpull.v1.XmlPullParser' –