1

需要您的帮助才能从 Android 中的 httpclient 获取 json 响应,因为下面提到的代码会使应用程序在 android 设备上崩溃,特别是在 GingerBread 设备上,因为 JSON 响应的大小非常大(可能是 7 MB)。所以我想知道从 Httpclient 读取 JSONresponse 的任何替代方法,因为目前的实现消耗了太多内存并使我的应用程序在低端设备上崩溃。

对于解决此问题的任何建议或帮助将非常有用。

HttpClient httpClient = new DefaultHttpClient(ccm, params);
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Cache-Control", "no-cache; no-store");
HttpResponse httpResponse = httpClient.execute(httpGet);

response = Utils.convertStreamToString(httpResponse.getEntity().getContent());
public 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) {
               //System.gc();
                sb.append(line).append("\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
4

3 回答 3

1

Google Android 附带了一个非常过时的 Apache HttpClient 分支。但是,基本原则仍然适用。使用 Apache HttpClient 处理 HTTP 响应的最有效方法是使用ResponseHandler. 有关详细信息,请参阅我对类似问题的回答

于 2013-08-29T08:57:36.877 回答
1

你可以试试这个:

public static String convertStreamToString(InputStream is)
{
    try
    {
      final char[] buffer = new char[0x10000];
      StringBuilder out = new StringBuilder();
      Reader in = new InputStreamReader(is, "UTF-8");
      int read;
      do
      {
        read = in.read(buffer, 0, buffer.length);
        if (read > 0)
        {
          out.append(buffer, 0, read);
        }
      } while (read >= 0);
      in.close();
      return out.toString();
    } catch (IOException ioe)
    {
      throw new IllegalStateException("Error while reading response body", ioe);
    }
}
于 2013-08-28T07:09:42.793 回答
1

您可以使用Google Volley进行联网。在许多其他事情中,它有一个内置的方法来检索 JSON 对象,无论大小。

试试看。

于 2013-08-28T07:16:45.340 回答