Android: передача данных из класса DefaultHandler в Activity? - PullRequest
1 голос
/ 19 апреля 2011

Я работаю над приложением для Android, где я буду использовать SAX довольно часто. Мне было интересно, как лучше всего отправить «данные» или результаты из моего обработчика обратно в мою деятельность?

IMO, это немного грязно, вызывать намерения или создавать тосты и т. Д. В моем обработчике, и я предпочел бы делать такие вещи из моей деятельности, в зависимости от того, что происходит в моем обработчике.

Что вы, ребята, думаете? Как мне сделать это чистым способом?

Вот пример кода:

        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;

            }

Я бы предпочел не показывать эти тосты из моего класса обработчиков.

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

В моем текущем приложении я довольно много разобрал XML, и этот пример очень помог.

Проектируйте мудро, я верю, что вместо тостов или намеренной трансляции и т. Д. Вы должны использовать пользовательский обработчик SAX, который будет создавать экземпляр объекта Parse в начальном XML-элементе. Этот объект является представлением ваших элементов XML. Так что, возможно, объект будет Car и имеет установщик / получатель для Door, Color, Wheels. При разборе данных в парсере SAX вы будете устанавливать эти значения. когда анализатор SAX заканчивает анализ, вы вызываете свой анализатор, чтобы он передал объект вашей деятельности, заполненный всеми машинами из вашего XML. В моем случае я фактически заполняю список / массив моих объектов, которые передаются обратно. В примере рассматривается только один набор данных. Во всяком случае, эта ссылка объясняет все это.

Редактировать: просто смотрел на мой код, на самом деле то, что я делаю в своем обработчике - это создание массива объектов моего набора ParsedData, которые передаются обратно в действие после завершения анализа с помощью getParsedData (). Вот несколько важных кодов:

Обработчик 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));
    }
}

Вот мой пример ParsedDataSampleSet (его можно называть как угодно), очевидно, вы хотите заменить siteName и idSite на что-то еще. Это всего лишь мои элементы XML

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, которые передаются обратно в действие. это гораздо лучшее решение, чем использование тостов или широковещательных рассылок, потому что это более несвязанное решение

Редактировать 2: В первом посте на этой 2-й странице сайта, на который я ссылался, упоминается разбор нескольких элементов XML, таких как мой. Смотрите здесь ( парсинг нескольких элементов xml ).

Надеюсь, это поможет вам

0 голосов
/ 19 апреля 2011

Я бы использовал пользовательский Handler, который я создал в своей деятельности и передал его анализатору XML.Затем в этом парсере я мог бы вызвать несколько sendMessage для пользовательского обработчика.

Пример использования обработчика здесь .

0 голосов
/ 19 апреля 2011

Вы могли бы:

  1. Передайте действие в XML обработчик, сохраните его как экземпляр переменная, и перезвонить ей как необходимо.

  2. Создайте статический член в своей деятельности и назначьте его для это когда он создан. Затем из вашего обработчика XML вы можете ссылаться на ActivityClass.getMyActivity () [например] и вызывать какой-то метод для всплывающего тоста.

iOS / Mac OS X имеет концепцию, называемую «уведомления», где любой код может зарегистрировать интерес к какому-либо событию. Если есть Android-эквивалент, это был бы другой способ сделать это, я. е. обработчик XML может транслировать какое-то событие / уведомление о сбое, а Activity может его прослушать и вывести тост.

...