5

我收到了巨大的 JSON,并且当我阅读 OutOfMemoryError 行时出现。

这是我尝试解析 JSON 的第一种方法。

    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
    String result = "";

    while (true) {

                String ss = reader.readLine();
                if (ss == null) {
                        break;
                }
                result += ss;
   }

而且我也试过这种方法。

    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;

    while ( (line = reader.readLine()) != null)
    {
    sb.append(line);
    }

在这两种情况下,OutOfMemoryErorr 都会出现。

4

4 回答 4

3

大多数错误将由于堆大小而发生。您需要增加堆的大小

增加堆大小

有关 java 中堆大小的更多信息,请访问此处

于 2013-01-28T14:30:58.363 回答
3

我发现的最佳解决方案是提高应用程序的堆。

我放在android:largeHeap="true"<application/>AndroidManifest.xml

于 2013-01-29T07:40:11.590 回答
2

当您实例化您的BufferedReader时,您传入一个int sizeof 8,这意味着您的缓冲区是 8 个字符(我认为这不是您想要的)。如果您传递 no size,则默认值为 8192 个字符。

尝试这个:

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));

或者这个(同样的效果):

BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8192);

http://developer.android.com/reference/java/io/BufferedReader.html

我不完全确定这会解决你看到的错误,但如果你不能让它工作,值得一试。

于 2013-01-28T14:39:48.040 回答
1

我的 JSON 代码正在等待状态,即将结束。所以我修改了代码以提前返回。

// try to get formattedAddress without reading the entire JSON
        String formattedAddress;
        while ((read = in.read(buff)) != -1) {
            jsonResults.append(buff, 0, read);
            formattedAddress = ((String) ((JSONObject) new JSONObject(
                    jsonResults.toString()).getJSONArray("results").get(0))
                    .get("formatted_address"));
            if (formattedAddress != null) {
                Log.i("Taxeeta", "Saved memory, returned early from json") ;
                return formattedAddress;
            }               
        }
JSONObject statusObj = new JSONObject(jsonResults.toString());
        String status = (String) (statusObj.optString("status"));
        if (status.toLowerCase().equals("ok")) {
            formattedAddress = ((String) ((JSONObject) new JSONObject(
                    jsonResults.toString()).getJSONArray("results").get(0))
                    .get("formatted_address"));
            if (formattedAddress != null) {
                Log.w("Taxeeta", "Did not saved memory, returned late from json") ;
                return formattedAddress;
            }           
        } 
于 2014-08-06T05:11:24.737 回答