【发布时间】:2012-12-17 11:23:42
【问题描述】:
我有一个 Android 应用程序,它使用 ByteArrayEntity 对象将 JSONObject 作为实体发布。如下所示:
post.setEntity(new ByteArrayEntity(entity.getBytes("UTF-8")));
result = client.execute(post, handler);
实体是String。处理程序是ResponseHandler<String>,客户端是HttpClient。这在模拟器和某些设备上运行良好。但是,有时我在 x10i(也称为 XPERIA)上执行时遇到 OutOfMemoryError。
这里是堆栈:
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 个字符。怎么了?
【问题讨论】:
-
服务器响应的大小是多少?
-
例如stackoverflow.com/questions/3055614/…也有类似的错误,但似乎与一般内存使用有关,而不是与AbstractSessionInputBuffer隔离。
-
谢谢,已经检查了所有答案,并使用了 DDMS。但正如我所说,在模拟器上一切都很好。
-
@Ogulcan 在使用您的应用一段时间后(打开+关闭一些活动,发出许多网络请求),您的应用的内存使用情况是多少(转到设置-> 应用程序管理器)?
-
OOM 是在第一次调用 HTTPClient 代码时发生,还是在多次/多次调用后发生?
标签: java android json httpclient out-of-memory