当我尝试在Verizon的4G/LTE上使用我的应用程序时,我收到了一些崩溃用户的报告.
查看堆栈跟踪,看起来Android的HttpClient.execute()实现正在抛出一个OOM.这仅发生在4G/LTE设备上,特别是HTC Thunderbolt,并且仅在4G/LTE上.WiFi,3G,UMTS都可以.也适用于Sprint的WiMax 4G工作正常.
两个问题:
什么是引起Android开发者注意的最佳方式?除了在http://code.google.com/p/android/issues上报告之外,还有哪些更好的选择?
关于如何解决这个问题的任何想法?我自己没有4G设备,我无法在模拟器中实现这一点,所以我需要在这里做一些有根据的猜测.我可以尝试在我的代码中捕获OOM并尝试清理并强制GC,但我不确定这是不是一个好主意.评论或其他建议?
这是我的代码正在做的事情:
HttpParams params = this.getHttpParams(); // returns params
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, this.getHttpSchemeRegistry() );
DefaultHttpClient httpClient = new DefaultHttpClient( cm, params );
HttpResponse response = null;
request = new HttpGet( url );
try {
response = httpClient.execute(request); // <-- OOM on 4G/LTE. OK otherwise
int statusCode = response.getStatusLine().getStatusCode();
Log.i("fetcher", "execute returned, http status " + statusCode );
...
Run Code Online (Sandbox Code Playgroud)
这是崩溃的堆栈跟踪:
E/dalvikvm-heap(11639):2055696字节分配的内存不足.I/dalvikvm(11639):"Thread-16"prio = 5 tid = 9 RUNNABLE I/dalvikvm(11639):| group ="main"sCount = …
我有一个Android应用程序,JSONObject通过使用ByteArrayEntity对象发布为实体.这是它的样子:
post.setEntity(new ByteArrayEntity(entity.getBytes("UTF-8")));
result = client.execute(post, handler);
Run Code Online (Sandbox Code Playgroud)
实体是一个String.处理程序是ResponseHandler<String>和客户端是一个HttpClient.这在模拟器和某些设备上运行良好.但是,有时我在执行时会得到OutOfMemoryError x10i(也称为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)
Run Code Online (Sandbox Code Playgroud)
正如我所说,我只是将JSONObject发布为String.它最多可能是200个字符.怎么了?