【问题标题】:Get Error during handling the Response in post web service在后期 Web 服务中处理响应时出错
【发布时间】:2012-05-22 05:48:47
【问题描述】:

我正在调用网络服务在地图上绘制点。我在回复中找到了 750 条记录。当页面第二次加载时,它显示了这个错误。

致命异常:Thread-26 java.lang.OutOfMemoryError 在 java.lang.String.(String.java:513) 在 org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:261) 在 org.apache.http.util.EntityUtils.toString(EntityUtils.java:141) 在 org.apache.http.util.EntityUtils.toString(EntityUtils.java:146) 在 org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:76) 在 org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616) 在 com.roundmenu.Nearme.run(Nearme.java:583) 在 java.lang.Thread.run(Thread.java:1019)

@Override
public void run() {
    try {
        HttpGet post = null;

        Log.e("", "Share.isfromfilter =  " + Share.isfromfilter);
        if (Share.isfromfilter) {

            Log.e("", "Teset 1");

            Log.e("", "Share.CuisineValue =  " + Share.CuisineValue);

            if (Share.CuisineValue.equalsIgnoreCase("")) {
                Log.e("", "Teset 2");
                post = new HttpGet("my url here");
            } else {
                Log.e("", "Teset 3");
                post = new HttpGet("my url here");
            }

        } else {
            Log.e("", "Teset 4");
            post = new HttpGet("my url here");

        }
        post.addHeader("apikey", "880639B3638597349AC1BE6F70FC5682");
        ResponseHandler<String> responseHandler = new BasicResponseHandler();

        response = client.execute(post, responseHandler);
        System.out.println("----------------------------------------");
        System.out.println(response);

        handler.sendEmptyMessage(0);
    } catch (Exception e) {
        e.printStackTrace();
        handler.sendEmptyMessage(1);
    }
}

在执行此代码的过程中,我也遇到了 VM Out of Budget 错误。

【问题讨论】:

    标签: android memory virtual


    【解决方案1】:

    Android Dalvik VM 有堆限制。你能告诉 Web 服务返回了多少字节吗? 如果数据量很大,建议增量读取数据,而不是全部传输到一个大的字符串缓冲区中。

    请参考http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/HttpClient.html

    HttpResponse response = httpclient.execute(post);
    HttpEntity entity = response.getEntity();
    
    if (entity != null) {
      InputStream instream = entity.getContent();
      try {
        BufferedReader reader = new BufferedReader(
                 new InputStreamReader(instream));
        String data = null;
        while ((data = reader.readLine()) != null) {
          ...
        }
      }
    }
    

    【讨论】:

    • 我的响应中有 23000 字节的数据
    • 很难根据调用堆栈的回溯来判断和识别根本原因。您可以尝试 DDMS 来检查您的应用程序中的堆/内存使用情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多