【问题标题】:Out Of Memory String Android内存字符串不足 Android
【发布时间】:2013-01-28 14:25:36
【问题描述】:

我收到了巨大的 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 都会出现。

【问题讨论】:

标签: android out-of-memory


【解决方案1】:

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

To increase the heap size

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

【讨论】:

  • 这是错误的。他将无法在真实设备上更改堆大小。而且我不确定 -Xmx2048m 选项会改变 android 中的任何内容。
  • 我在运行配置中找不到“参数”选项。我正在使用 Android 开发工具 (Eclipse)。
【解决方案2】:

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

我将android:largeHeap="true" 放在AndroidManifest.xml 中的<application/> 下。

【讨论】:

【解决方案3】:

当您实例化您的BufferedReader 时,您传入8 的int size,这意味着您的缓冲区是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

我不完全确定这会解决您看到的错误,但如果您无法使其正常工作,值得一试。

【讨论】:

  • 我正在使用 BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"), 8192);并且还有内存不足。
  • 嗯...我在上面读到你说你有 20 个对象,每个对象 10MB?如果是这种情况,那就是您试图在内存中保存的 200MB 有效负载(因此出现 OOM 错误)。即使是 10MB 也是 JSON 的巨大负载,因为许多设备的应用程序堆大小约为 20-30MB。您可能需要考虑分块下载或分解服务返回的 JSON。
  • 我希望这是最坏的情况,但似乎这是唯一的方法。谢谢先生。
【解决方案4】:

我的 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;
            }           
        } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2012-12-09
    相关资源
    最近更新 更多