当我尝试在 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 );
...
这是崩溃的堆栈跟踪:
E/dalvikvm-heap(11639):2055696 字节分配内存不足。I/dalvikvm(11639): "Thread-16" prio=5 tid=9 RUNNABLE I/dalvikvm(11639): | group="main" sCount=0 dsCount=0 s=N obj=0x48563070 self=0x3c4340 I/dalvikvm(11639): | sysTid=11682 nice=0 sched=0/0 cgrp=默认句柄=3948760 I/dalvikvm(11639): | schedstat=(208709711 74005130 214)
I/dalvikvm(11639): 在 org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:~79) I/dalvikvm(11639): 在 org.apache.http.impl.io.SocketInputBuffer.( SocketInputBuffer.java:93) I/dalvikvm(11639):在 org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83) I/dalvikvm(11639):在 org.apache.http.impl.conn。 DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170) I/dalvikvm(11639):在 org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106) I/dalvikvm(11639):在 org.apache.http。 impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129) I/dalvikvm(11639):在 org.apache.http.impl.conn.DefaultClientConnectionOperator。openConnection(DefaultClientConnectionOperator.java:173) I/dalvikvm(11639): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) I/dalvikvm(11639): at org.apache.http。 impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) I/dalvikvm(11639): 在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) I/dalvikvm(11639): 在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) I/dalvikvm(11639): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) I/ dalvikvm(11639): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) I/dalvikvm(11639): 在 com.myapplication.Fetcher.trySourceFetch(Fetcher.java:205) I/ dalvikvm(11639):在 com。myapplication.Fetcher.run(Fetcher.java:298) I/dalvikvm(11639): 在 java.lang.Thread.run(Thread.java:1102) I/dalvikvm(11639): E/dalvikvm(11639): 超出内存:堆大小=24171KB,分配=23142KB,位图大小=59KB,限制=21884KB E/dalvikvm(11639):额外信息:足迹=24327KB,允许足迹=24519KB,修剪=348KB W/dalvikvm(11639):threadid= 9:线程以未捕获的异常退出(组=0x40025b38)线程以未捕获的异常退出 (group=0x40025b38)线程以未捕获的异常退出 (group=0x40025b38)