1

apachehttpclientを使用してインターネットからテキストファイルを取得しようとしています。私は次のコードを使用しています:

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet getHNMR = new HttpGet("http://www.hmdb.ca/labm/metabolites/" + HMDB + "/chemical/pred_hnmr_peaklist/" + HMDB + "_peaks.txt");
        HttpGet getCNMR = new HttpGet("http://www.hmdb.ca/labm/metabolites/" + HMDB + "/chemical/pred_cnmr_peaklist/" + HMDB + "_peaks.txt");

        try {
            responseH = httpclient.execute(getHNMR);
            responseC = httpclient.execute(getCNMR);
        } catch (ClientProtocolException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            System.out.println("client exception");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            System.out.println("ioexception");
        }
        //Generate HNMR peak list
        HttpEntity entityH = responseH.getEntity();
        HttpEntity entityC = responseH.getEntity();;
        try {
            HNMR = EntityUtils.toString(entityH);
            CNMR = EntityUtils.toString(entityC);
        } catch (ParseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            System.out.println("parseexception");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            System.out.println("ioexception");
        }
    //Set peak lists to textarea
        HC.setText(CNMR + "\n" + HNMR);

次のスタックトレースを取得しています。

Thread [pool-2-thread-1] (Suspended (exception IllegalStateException))  
ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1128  
ThreadPoolExecutor$Worker.run() line: 603   
Thread.run() line: 679  

私はデバッグにあまり詳しくないので、正確に何が起こっているのかわかりません。

4

2 に答える 2

2

接続を別の要求に使用する前に、応答本文を消費する必要があります。次のHTTP実行の前に、応答InputStreamを完全に読み取る必要があります。コードは次の順序で表示されます。

    responseH = httpclient.execute(getHNMR);
    HttpEntity entityH = responseH.getEntity();
    HNMR = EntityUtils.toString(entityH);

    responseC = httpclient.execute(getCNMR);
    HttpEntity entityC = responseC.getEntity();
    CNMR = EntityUtils.toString(entityC);
于 2012-08-06T14:56:21.750 に答える
1

httpClientを使用する必要がありますか?これはテキストファイルのみであり、postやgetパラメータは必要ない場合、より簡単な方法は次のようになります。

URL url = new URL("http://www.hmdb.ca/labm/metabolites/" + HMDB + "/chemical/pred_hnmr_peaklist/" + HMDB + "_peaks.txt");
InputStream response = url.openConnection().getInputStream();
于 2012-08-06T15:16:48.000 に答える