2 Stimmen

Android HttpResponse

Mein if (httpResponse == null) Block wird nicht ausgeführt. Wie könnte es implementiert werden, bevor HttpResponse httpResponse = httpClient.execute(httpPost);

Bitte zeige mir, wie es gemacht werden könnte.

    public class XMLParser {
    private Activity activity = null;
    // Konstruktor
    public XMLParser(Activity act) {
        activity = act;
    }

    /**
     * XML von URL abrufen und HTTP-Anforderung erstellen
     * @param url string
     * */
    public String getXmlFromUrl(String url) {
        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // XML zurückgeben
        return xml;
    }

    /**
     * XML-DOM-Element abrufen
     * @param XML string
     * */
    public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));
                doc = db.parse(is); 

            } catch (ParserConfigurationException e) {
                Log.e("Fehler: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                AlertDialog.Builder builder = new AlertDialog.Builder( activity ); //<<-- Dieser Teil wirft eine Ausnahme " ThreadPoolExecutor "
                builder.setMessage( "Host nicht gefunden" )
                        .setCancelable(false)
                        .setPositiveButton("Beenden",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        System.exit(0);
                                    }

                                });
                AlertDialog alert = builder.create();
                alert.show();
                Log.e("Fehler: ", e.getMessage());
                return null;
            } catch (IOException e) {
                Log.e("Fehler: ", e.getMessage());
                return null;
            }

            return doc;
    }

    /** Knotenwert abrufen
      * @param elem Element
      */
     public final String getElementValue( Node elem ) {
         Node child;
         if( elem != null){
             if (elem.hasChildNodes()){
                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
                     if( child.getNodeType() == Node.TEXT_NODE  ){
                         return child.getNodeValue();
                     }
                 }
             }
         }
         return "";
     }

     /**
      * Knotenwert abrufen
      * @param Element Knoten
      * @param key string
      * */
     public String getValue(Element item, String str) {     
            NodeList n = item.getElementsByTagName(str);        
            return this.getElementValue(n.item(0));
        }
}

2voto

Jochem Punkte 2975

Wenn etwas schief geht, wird execute nicht null zurückgeben, sondern eine Ausnahme werfen. Wenn beispielsweise der Host nicht gefunden wird, wirft er eine UnknownHostException. Diese Ausnahme ist eine Unterklasse von IOException.

Ihr Code ist darauf ausgelegt, IOException zu 'fangen'. Aber wenn dies geschieht, drucken Sie nur einen Stacktrace (dies kann in Orange in Ihrem LogCat gesehen werden) und tun nichts. Als nächstes wird die Anweisung 'return xml' ausgeführt und Ihre Methode endet.

Wenn Sie also den Fall abfangen möchten, dass ein Host nicht existiert, könnten Sie ihn wie folgt neu schreiben. Um mehr Fehler abzufangen, sollten Sie wahrscheinlich den IOException-Catch-Block ausarbeiten. Bitte stellen Sie sicher, dass Sie verstehen, was passiert und wie die Fehlerbehandlung funktioniert.

public String getXmlFromUrl(String url) {
    String xml = null;

    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = httpClient.execute(httpPost);

        HttpEntity httpEntity = httpResponse.getEntity();
        xml = EntityUtils.toString(httpEntity);

    } catch (UnknownHostException e) {
        AlertDialog.Builder builder = new AlertDialog.Builder( activity );
        builder.setMessage( "Host nicht gefunden" )
                .setCancelable(false)
                .setPositiveButton("Beenden",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                System.exit(0);
                            }

                        });
        AlertDialog alert = builder.create();
        alert.show();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    // return XML
    return xml;
}

-1voto

Jose L Ugia Punkte 5822

Ich glaube nicht, dass eine Nichtantwort vom Server eine Nullantwort erzeugt. Können Sie das debuggen und den Wert von httpResponse zur Laufzeit erkunden?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X