java - HttpClient.execute 抛出 OutOfMemoryError

标签 java android json httpclient out-of-memory

我有一个发布 JSONObject 的 Android 应用程序作为实体使用 ByteArrayEntity目的。这是它的样子:

post.setEntity(new ByteArrayEntity(entity.getBytes("UTF-8")));
result = client.execute(post, handler);

实体是一个 String .处理程序是 ResponseHandler<String>客户是 HttpClient .这在模拟器和某些设备上运行良好。但是,有时我在执行 x10i 时遇到 OutOfMemoryError (也称为 XPERIA)。

这是堆栈:

java.lang.OutOfMemoryError
at org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:79)
at org.apache.http.impl.io.SocketInputBuffer.<init>(SocketInputBuffer.java:93)
at org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83)
at org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170)
at org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106)
at org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:171)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:580)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:678)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:652)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
at com.test.application.api.Request.post(Request.java:102)
at com.test.application.api.API.getResult(API.java:123)
at com.test.application.api.APITask.doInBackground(APITask.java:127)
at com.test.application.api.APITask.doInBackground(APITask.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)

正如我所说,我只是将 JSONObject 作为字符串发布。最多可以是 200 个字符。怎么了?

最佳答案

Android 设备有每个进程的内存限制。默认默认值为 24MB,但某些设备具有较低的值,例如 16MB 或更低。 X10i 似乎有 384MB RAM,这对于现代 Android 设备来说太低了(现在 1GB 是标准配置),这可能会带来额外的限制。

我建议:

  1. 首先检查您设备上的每个进程限制。使用 ActivityManager.getMemoryClass()检查。
  2. 使用 DDMS 查看您的实际内存使用情况.

您可能会发现,就在您进行此调用之前,您已经处于内存上限; HTTPClient 的初始化和调用可能会超出限制。如果 OOM 发生在第一个 调用上,则更有可能发生这种情况。

如果这种情况只是偶尔发生,或者在多次调用之后发生,则可能存在内存泄漏。 DDMS 将帮助您使用 get allocations 进行追踪。功能。

关于java - HttpClient.execute 抛出 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913186/

相关文章:

json - Vue.js 中导入的 json 值不正确

json - SQL Server 2016 - 如何从 JSON 中选择整数数组

java - Java 线程中的函数 Join()

android - 如何将数据从网站服务器发送到Android应用程序

Android - AVD 删除用户数据不起作用

Android AsyncTask 传递变量值

java - 如何在不改变Y坐标的情况下设置X坐标中的鼠标位置

java - AEM 中的多字段组件 - 不保存值

Java 说这个方法有一个构造函数名称

javascript - 使用 jQuery 循环 JSON