Out of Memory String Android

时间:2013-01-28 14:25:37

标签: android out-of-memory

我收到了巨大的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 个答案:

答案 0 :(得分:3)

大多数情况下,由于堆大小会发生错误。您需要增加堆的大小

To increase the heap size

有关java中堆大小的其他信息,请访问here

答案 1 :(得分:3)

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

我将android:largeHeap="true"置于<application/>的{​​{1}}下。

答案 2 :(得分:2)

当您实例化BufferedReader时,传入int size 8,意味着您的缓冲区为8个字符(我认为这不是您想要的)。如果您未传递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

我不完全确定会修复您看到的错误,但如果您无法正常工作,请务必尝试。

答案 3 :(得分: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;
            }           
        }