【发布时间】:2011-07-18 11:57:59
【问题描述】:
当我尝试在 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):“线程 16”prio=5 tid=9 可运行 I/dalvikvm(11639):| group="main" sCount=0 dsCount=0 s=N 对象=0x48563070 自我=0x3c4340 我/dalvikvm(11639):|系统时间=11682 nice=0 sched=0/0 cgrp=default 句柄=3948760 I/dalvikvm(11639):| schedstat=(208709711 74005130 214)
I/dalvikvm(11639):在 org.apache.http.impl.io.AbstractSessionInputBuffer.init(AbstractSessionInputBuffer.java:~79) 我/dalvikvm(11639):在 org.apache.http.impl.io.SocketInputBuffer.(SocketInputBuffer.java:93) 我/dalvikvm(11639):在 org.apache.http.impl.SocketHttpClientConnection.createSessionInputBuffer(SocketHttpClientConnection.java:83) 我/dalvikvm(11639):在 org.apache.http.impl.conn.DefaultClientConnection.createSessionInputBuffer(DefaultClientConnection.java:170) 我/dalvikvm(11639):在 org.apache.http.impl.SocketHttpClientConnection.bind(SocketHttpClientConnection.java:106) 我/dalvikvm(11639):在 org.apache.http.impl.conn.DefaultClientConnection.openCompleted(DefaultClientConnection.java:129) 我/dalvikvm(11639):在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:173) 我/dalvikvm(11639):在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 我/dalvikvm(11639):在 org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 我/dalvikvm(11639):在 org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348) 我/dalvikvm(11639):在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 我/dalvikvm(11639):在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 我/dalvikvm(11639):在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 我/dalvikvm(11639):在 com.myapplication.Fetcher.trySourceFetch(Fetcher.java:205) 我/dalvikvm(11639):在 com.myapplication.Fetcher.run(Fetcher.java:298) 我/dalvikvm(11639):在 java.lang.Thread.run(Thread.java:1102) 我/dalvikvm(11639):E/dalvikvm(11639): 内存不足:堆大小=24171KB, 已分配=23142KB,位图大小=59KB, 限制=21884KB E/dalvikvm(11639):额外 信息:足迹=24327KB,允许 占用空间=24519KB,修剪=348KB W/dalvikvm(11639): threadid=9: 线程 以未捕获的异常退出 (组=0x40025b38)
【问题讨论】:
-
确认我正在跟踪同样的问题。仅出现在 verizon_wwe 上的 htc_mecha (thunderbolt) 上。问题于 2011 年 3 月 17 日首次出现。
-
我去买了一个 HTC Thunderbolt 来诊断这个问题。 CommonsWare 下面说的是正确的。手动将缓冲区设置为 8k 可以解决崩溃问题。不知道为什么 HTC 决定改变这一点。希望他们喜欢手机补货计数++。
-
太棒了,我也遇到了这个问题。感谢您的确认。
-
这也发生在 LG P920 设备上
标签: android httpclient 4g htc-android htc-thunderbolt