1

while ((line = br.readLine()) != null) {以下の完全なコードのBufferedReader.readLine() を実行すると、IOException が発生しました。Exception.getMessage()戻り値BufferedInputStream is closed 。

これは HTC デバイスでのみ発生し、Sony Ericsson XPERIA を使用すると発生しません。

私の完全なコード:

public static String downloadString(String url) throws MalformedURLException, IOException {     
    InputStream is = downloadStream(url);

    //Convert stream into String
    String line;
    BufferedReader br = new BufferedReader(new InputStreamReader(is), 4096);            
    StringBuilder sb =  new StringBuilder();
    while ((line = br.readLine()) != null) {
        sb.append(line);
    }
    br.close();
    return sb.toString();
}

public static InputStream downloadStream(String url) throws MalformedURLException, IOException {
    return connection(url).getInputStream();
}

private static HttpURLConnection connection(String s_url) throws MalformedURLException, IOException {
    URL url = new URL(s_url);
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.setDoOutput(true);
    urlConnection.connect();

    return urlConnection;
}

すべてのデバイスで機能するより優れた downloadString メソッドを作成するにはどうすればよいですか?

前もって感謝します。あなたの答えに本当に感謝します

4

2 に答える 2

1

HttpGetを使用してhttpGET接続を処理してみてください(およびHttpPostを使用してhttp POSTを処理してください)

必要のないときは、必ずストリームを閉じてください。

ここでは、httpgetを使用してサーバーから文字列を取得する簡単なコードを示します。

 private void executeRequest(HttpUriRequest request)
{
    HttpClient client = new DefaultHttpClient();

    HttpResponse httpResponse;
    try {
        httpResponse = client.execute(request);
        responseCode = httpResponse.getStatusLine().getStatusCode();
        message = httpResponse.getStatusLine().getReasonPhrase();

        System.out.println(responseCode + ":" +message);

        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            response = convertStreamToString(instream);

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        Toast.makeText(null, "Error", Toast.LENGTH_LONG);
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        Toast.makeText(null, "Error", Toast.LENGTH_LONG);
    } catch (OAuthMessageSignerException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (OAuthExpectationFailedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (OAuthCommunicationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

private static String convertStreamToString(InputStream is) {

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

次のように関数を呼び出すことができます。

HttpGet request = new HttpGet(url);

executeRequest(request);

于 2012-04-16T09:19:02.490 に答える
1

それを試してみてください -

public static String getContent(String url) throws Exception {
      return(new Scanner(new URL(url).openConnection().getInputStream()).useDelimiter("/z").next());
}
于 2012-04-16T06:50:17.670 に答える