Получих някои доклади от потребители за сривове, когато се опитах да използвам приложението си в 4G/LTE на Verizon.
Разглеждайки проследяването на стека, изглежда, че изпълнението на HttpClient.execute() на Android хвърля OOM. Това се случва само на 4G/LTE устройства, по-специално HTC Thunderbolt, и само когато сте на 4G/LTE. WiFi, 3G, UMTS са ОК. Също така работи добре на WiMax 4G нещата на Sprint работят добре.
Два въпроса:
Кой е най-добрият начин да привлечете вниманието на разработчиците на 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): в 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): Няма памет: Heap Size=24171KB, Разпределено =23142KB, Размер на растерна карта=59KB, Лимит=21884KB E/dalvikvm(11639): Допълнителна информация: Footprint=24327KB, Allowed Footprint=24519KB, Trimmed=348KB W/dalvikvm(11639): threadid=9: нишка излиза с неуловено изключение ( група=0x40025b38)