2013-05-16 9 views
1

우리는 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; 
} 
+1

그냥 알아 냈습니다 :'parse()'를 호출 한 후에'Thread.sleep (1000)'을 추가하면 도움이됩니다. 아직도 이것을 이해하지 못합니다. –

+0

어떤 XML 파서 구현을 사용하고 있습니까? –

+1

'org.xmlpull.v1.XmlPullParser' –

답변

1

는 사실, 나는이 디자인 문제라고 생각합니다. xmlParser.parse()에 대한 호출은 백그라운드에서 실행하려는 작업입니다. 그 전후의 모든 것은이 작업을 유발하는 다른 방법에 속합니다.

@Background 기능이 어떻게 작동하는지 모르지만 http://developer.android.com/reference/android/os/AsyncTask.html을 사용하면 onProgressUpdate (여기에 showProgressDialog() 넣기)와 onPostExecute 콜백 (여기에 dismissProgressDialog() 넣기)이 있습니다. android annotations의 문서를 보면 다음과 같이 제안 할 것입니다.

+1

고마워, 나에게도 이상하게 보였다. 이것을 (실제로는 아주 일반적인 패턴 인) 이렇게하는 것이 도움이되었습니다. –