1

私は、SAX をかなり使用する Android アプリケーションに取り組んでいます。「データ」または結果をハンドラーからアクティビティに送信する最良の方法は何だろうかと考えていました。

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;

            }

これらの Toasts をハンドラー クラスから表示したくありません。

4

3 に答える 3

1

私は現在のアプリでかなりの量の XML 解析を行ってきましたが、これはこの例が大いに役立ちました。

設計に関しては、トーストやインテント ブロードキャストなどの代わりに、最初の XML 要素で Parse オブジェクトをインスタンス化するカスタム SAX ハンドラを使用する必要があると思います。このオブジェクトは、XML アイテムの表現です。したがって、オブジェクトは Car で、Door、Color、Wheels のセッター/ゲッターを持つ場合があります。SAX パーサーでデータを解析するときに、これらの値を設定します。SAX パーサーが解析を終了したら、パーサーを呼び出して、XML からのすべての車でいっぱいになっているアクティビティにオブジェクトを戻します。私の場合、実際に返されるオブジェクトのリスト/配列を作成します。この例では、1 セットのデータのみを扱います。とにかく、そのリンクはそれをすべて説明しています。

編集:コードを見ただけで、実際にハンドラーで行うことは、解析が完了した後にアクティビティに返される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要素を解析します)。

これがお役に立てば幸いです

于 2011-04-18T22:16:14.747 に答える
0

あなたは出来る:

  1. アクティビティを XML ハンドラーに渡し、インスタンス変数として格納し、必要に応じてコールバックします。

  2. アクティビティに静的メンバーを作成し、作成時にアクティビティを割り当てます。次に、XML ハンドラーから ActivityClass.getMyActivity() [たとえば] を参照し、トーストをポップするメソッドを呼び出すことができます。

iOS/Mac OS X には「通知」と呼ばれる概念があり、任意のコードで何らかのイベントへの関心を登録できます。Android に相当するものがある場合は、これを行う別の方法になります。つまり、XML ハンドラーが何らかの失敗イベント/通知をブロードキャストし、アクティビティがそれをリッスンしてトーストをポップすることができます。

于 2011-04-18T21:24:37.920 に答える
0

アクティビティで作成したカスタムHandlerを使用し、それを XML パーサーに渡します。次に、このパーサー内sendMessageで、カスタム Handler でいくつかを呼び出すことができます。

Handler の使用例はこちら

于 2011-04-18T22:14:45.073 に答える