Android HttpClient OOM на 4G / LTE (HTC Thunderbolt)

Я получил несколько отчетов от пользователей о сбоях при попытке использовать мое приложение на Verizon 4G / LTE.

трассировка стека, похоже, что реализация Android HttpClient.execute () выбрасывает OOM. Это происходит только на устройствах 4G / LTE, в частности HTC Thunderbolt, и только при использовании 4G / LTE. WiFi, 3G, UMTS в порядке. Также отлично работает с WiMax 4G от Sprint. Работает нормально.

Два вопроса:

  • Что? лучший способ привлечь к этому внимание разработчиков Android? Есть ли лучший вариант, чем сообщение о http://code.google.com/p/android/issues ?

  • Есть идеи, как я могу обойти это? У меня самого нет устройства 4G, и я не могу добиться этого в эмуляторе, поэтому мне нужно сделать некоторые обоснованные предположения. Я могу попытаться поймать OOM в моем коде и попытаться очистить и принудительно выполнить сборку мусора, но я не уверен, что это хорошая идея. Комментарии или другие предложения?

Вот что делает мой код:

    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): Недостаточно памяти Я могу попытаться поймать OOM в моем коде и попытаться очистить и принудительно выполнить сборку мусора, но я не уверен, что это хорошая идея. Комментарии или другие предложения?

Вот что делает мой код:

    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): Недостаточно памяти Я могу попытаться поймать OOM в моем коде и попытаться очистить и принудительно выполнить сборку мусора, но я не уверен, что это хорошая идея. Комментарии или другие предложения?

Вот что делает мой код:

    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 obj = 0x48563070 сам = 0x3c4340 I / dalvikvm (11639): | sysTid = 11682 nice = 0 sched = 0/0 cgrp = по умолчанию handle = 3948760 I / dalvikvm (11639): | schedstat = (208709711 74005130 214)

I / dalvikvm (11639): at 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): Extra информация: Footprint = 24327KB, Разрешено Размер = 24519 КБ, обрезанный = 348 КБ W / dalvikvm (11639): threadid = 9: поток выход с неперехваченным исключением (group = 0x40025b38)

21
задан EJoshuaS - Reinstate Monica 24 August 2017 в 18:07
поделиться