Я получил несколько сообщений от пользователей об авариях при попытке использовать мое приложение на 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 = default handle = 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): при org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) I/dalvikvm (11639): при 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): Недостаточно памяти: Размер кучи = 24171 КБ, Выделено = 23142 КБ, битмап Размер = 59 КБ, Предел = 21884 КБ E/dalvikvm (11639): Дополнительный информация: Footprint = 24327KB, разрешено Footprint = 24519KB, Trimmed = 348KB W/dalvikvm (11639): threadid = 9: thread выход с неперехваченным исключением (Группа = 0x40025b38)