2011-04-18 3 views
1

저는 SAX를 꽤 많이 사용할 안드로이드 응용 프로그램을 만들고 있습니다. '데이터'또는 결과를 처리기에서 내 활동으로 다시 보내는 가장 좋은 방법은 무엇일까요?Android : DefaultHandler 클래스의 데이터를 Activity로 전달 하시겠습니까?

는 IMO가 가지 지저분한 의도를 호출하거나 내 핸들러 내 등 토스트를 만들려면, 난 내 처리기 내에서 발생하는에 따라 내 활동에서 사물의 그 종류를 할 prefere 것입니다.

너희들은 어떻게 생각하니? 나는 이것을 깨끗한 방법으로 어떻게해야 하는가? 내 핸들러 클래스에서이 토스트를 표시하지 prefere 것

 public void startElement(String n, String l, String q, Attributes a) throws SAXException{ 
      if(l == "login") in_loginTag = true; 

      if(l == "error") { 

        if(Integer.parseInt(a.getValue("value")) == 1) 
         Toast.makeText(getApplicationContext(), "Couldn't connect to Database", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 2) 
         Toast.makeText(getApplicationContext(), "Error in Database: Table missing", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 3) 
         Toast.makeText(getApplicationContext(), "Invalid username and/or password", Toast.LENGTH_SHORT).show(); 

       error_occured = true; 

      } 

:

는 다음 코드 예입니다. 당신은 할 수

답변

2

내 현재 응용 프로그램에서 XML 파싱 꽤 해봤이 this example되어 많은 도움이되었다.

현명한 디자인 나는 토스트 나 인 텐트 방송 대신에 초창기 XML 요소에서 Parse 객체를 인스턴스화 할 사용자 정의 SAX 핸들러를 사용해야합니다. 이 객체는 XML 항목을 나타냅니다. 그래서 오브젝트가 Car 일 것이고 Door, Color, Wheels에 setter/getter가있을 것입니다. SAX 파서의 데이터를 파싱하면 해당 값이 설정됩니다. SAX 파서가 파싱을 마쳤을 때 파서가 객체를 XML의 모든 자동차로 가득 찬 액티비티로 되돌려 보내도록 호출합니다. 내 경우에는 실제로 반환되는 내 개체의 목록/배열을 채 웁니다. 이 예제는 한 세트의 데이터만을 처리합니다. 어쨌든 그 링크는 그것을 모두 설명합니다.

편집 : 사실 내 처리기에서 수행하는 작업은 getParsedData()를 통해 구문 분석 후 활동으로 전달되는 내 ParsedData 세트 개체 배열을 작성하는 것입니다.여기에 중요한 코드의 일부는 다음과 같습니다

XML 처리기 :

private boolean in_IdSite; 
private boolean in_SiteName; 

private ArrayList<ParsedChannelDataSet> list = new ArrayList<ParsedChannelDataSet>(); 

public ArrayList<ParsedChannelDataSet> getParsedData() { 
    return this.list; 
} 

@Override 
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 
    // first tag parsed so add a new ParsedEventDataSet object 
    if(localName.equals("stmSiteUser")) { 
     list.add(new ParsedChannelDataSet()); 
    } else if (localName.equals("idSite")) { 
     this.in_IdSite = true; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = true;  
    } 
} 

@Override 
public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 
    if (localName.equals("idSite")) { 
     this.in_IdSite = false; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = false; 
    } 
} 

@Override 
public void characters(char ch[], int start, int length) { 
    // determine if any tag is current, get data from tag and populate into ParsedEventDataSet 
    if (this.in_IdSite) { 
     this.list.get(this.list.size()-1).setExtractedIdSite(new String(ch, start, length)); 
    } else if (this.in_SiteName) { 
     this.list.get(this.list.size()-1).setExtractedSiteName(new String(ch, start, length)); 
    } 
} 

여기 분명히 다른 너무 뭔가적인 siteName 및 idSite를 교체하려면 (이 당신이 원하는대로 호출 할 수 있습니다) 내 샘플 ParsedDataSampleSet입니다. 이들은 단지

public class ParsedChannelDataSet { 
    private String extractedIdSite = null; 
    private String extractedSiteName = null; 


    public String getExtractedIdSite() { 
     return extractedIdSite; 
    } 

    public void setExtractedIdSite(String _extractedIdSite) { 
     this.extractedIdSite = _extractedIdSite; 
    } 

    public String getExtractedSiteName() { 
     return extractedSiteName; 
    } 

    public void setExtractedSiteName(String _extractedSiteName) { 
     Log.d("", _extractedSiteName); 
     this.extractedSiteName = _extractedSiteName; 
    }  


    public String toString() { 
     /* TODO */ 
     return "todo"; 
    } 
} 

그래서 당신은 내가 다시 활동에 전달되는 ParsedChannelDataSet 객체의 배열을 구축 볼 수 있습니다 내 XML 요소입니다. 이것은 토스트 나 브로드 캐스트를 사용하는 것보다 훨씬 더 좋은 해결책입니다. 더 분리 된 솔루션이기 때문에 더 편리합니다.

편집 2 : 사이트의이 두 번째 페이지에있는 첫 번째 게시물에서 광산과 같은 여러 XML 요소를 구문 분석하는 것에 대해 언급했습니다. 여기 (parse multiple xml elements)를 참조하십시오.

나는 이것이 당신이 활동에 등록 된 수신기 안드로이드 방송 의도 것이 설명하는 방법을 사용 제가 이해 한 내용을 아이폰 OS 억양 통지에서

+0

이전에이 예를 보았지만 간단히 살펴 보았습니다. 나는 아마도이 접근법으로 갈 것이다. 감사! – networkprofile

+0

방금 ​​샘플 코드를 추가했습니다. 실제로이 예제가 수행하지 않는 핸들러 내에서 구문 분석 된 객체 배열을 실제로 구현했습니다. – wired00

+0

정확하게'ParsedChannelDataSet'이 무엇인지, Google에서 그것에 대해 아무 것도 찾을 수 없습니다. 또한 정확히 여기에 무엇이 들어 있습니까? 'list.add (new ParsedChannelDataSet()); 또는'단지'stmSiteUser' 또는 무엇인가를 세고 있습니까? – networkprofile

1

:

  1. 에서, XML 핸들러로 활동을 통과 인스턴스 변수로 저장하고, 필요 로 다시에 문의하십시오.

  2. 액티비티에 정적 멤버를 만들고 액티비티를 으로 지정합니다. 그런 다음 XML 처리기에서 ActivityClass.getMyActivity() [예를 들어]를 참조하고 토스트를 팝하는 메소드를 호출 할 수 있습니다.

iOS/Mac OS X에는 어떤 이벤트에서 어떤 코드가 관심을 등록 할 수있는 "알림"이라는 개념이 있습니다. 안드로이드에 상응하는 것이 있다면, 이것도 또 다른 방법입니다. 이자형. XML 처리기는 일종의 실패 이벤트/알림을 방송 할 수 있으며 Activity는이를 수신하고 팝 ​​토스트를들을 수 있습니다.

+0

을 당신을 도움이되기를 바랍니다? – wired00

+0

그 것처럼 보입니다. 유감스럽게도 브로드 캐스트 이벤트를 보내려면 컨텍스트에 액세스해야하며 XML 처리기에서 컨텍스트를 사용할 수있게하려면 내 솔루션 (2)과 유사한 일부 작업이 필요하다고 생각됩니다. – mharper

0

나는 내 활동에 만든 사용자 지정 Handler를 사용하여 XML 파서에 전달한다. 그런 다음이 파서에서 사용자 정의 처리기에 sendMessage을 호출 할 수 있습니다.

처리기 here의 사용 예.

관련 문제