Я получил несколько сообщений от пользователей о сбоях при попытке использовать мое приложение на 4G/LTE от Verizon.
Глядя на трассировку стека, похоже, что реализация Android HttpClient.execute() выдает OOM. Это происходит только на устройствах 4G/LTE, особенно на HTC Thunderbolt, и только на 4G/LTE. Wi-Fi, 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): at 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(1163 9): в 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. выполнить(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): at com.myapplication.Fetcher.run(Fetcher.java:298) I/dalvikvm(11639): at java.lang.Thread.run(Thread.java: 1102) I/dalvikvm(11639): E/dalvikvm(11639): Недостаточно памяти: Размер кучи = 24171 КБ, Выделено = 23142 КБ, Размер растрового изображения = 59 КБ, Предел = 21884 КБ E/dalvikvm(11639): Дополнительная информация: Размер = 24327 КБ , Разрешенный размер = 24519 КБ B, Trimmed = 348 КБ W/dalvikvm (11639): threadid = 9: поток завершается с необработанным исключением (группа = 0x40025b38)