2

ブロックif (httpResponse == null)が実行されません。以前にどのように実装できたかHttpResponse httpResponse = httpClient.execute(httpPost);

どうすればできるか教えてください。

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

    /**
     * Getting XML from URL making HTTP request
     * @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();
        }
        // return XML
        return xml;
    }

    /**
     * Getting XML DOM element
     * @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("Error: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                AlertDialog.Builder builder = new AlertDialog.Builder( activity ); //<<-- This part throws an exception " ThreadPoolExecutor "
                builder.setMessage( "Host not found" )
                        .setCancelable(false)
                        .setPositiveButton("Exit",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        System.exit(0);
                                    }

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

            return doc;
    }

    /** Getting node value
      * @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 "";
     }

     /**
      * Getting node value
      * @param Element node
      * @param key string
      * */
     public String getValue(Element item, String str) {     
            NodeList n = item.getElementsByTagName(str);        
            return this.getElementValue(n.item(0));
        }
}
4

2 に答える 2

2

何か問題が発生した場合、executenull を返さずに例外をスローします。たとえば、ホストが見つからない場合、UnknownHostException. この例外は IOException のサブクラスです。

あなたのコードは「キャッチ」するように設計されていIOExceptionます。しかし、これが発生すると、スタックトレース (これは LogCat でオレンジ色で表示されます) を出力するだけで、何もしません。次に、'return xml' ステートメントが実行され、メソッドが終了します。

したがって、ホストが存在しない場合を「キャッチ」したい場合は、以下のように書き換えることができます。より多くのエラーをキャッチするには、おそらくIOExceptioncatch ブロックを作成する必要があります。何が起こるか、例外処理がどのように機能するかを理解していることを確認してください。

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 not found" )
                .setCancelable(false)
                .setPositiveButton("Exit",
                        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;
}
于 2012-08-26T12:24:52.603 に答える
-1

サーバーからの無応答がヌル応答を作成するとは思いません。実行時に httpResponse の値を調べてデバッグできますか?

于 2012-08-26T11:26:47.247 に答える