Android: ошибка с загрузкой изображений ThreadSafeClientConnManager
Для моего текущего приложения я собираю изображения от разных «провайдеров событий» в Испании.
Bitmap bmp=null;
HttpGet httpRequest = new HttpGet(strURL);
long t = System.currentTimeMillis();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
Log.i(TAG, "Image ["+ strURL + "] fetched in [" + (System.currentTimeMillis()-t) + "ms]");
HttpEntity entity = response.getEntity();
InputStream instream = entity.getContent();
bmp = BitmapFactory.decodeStream(instream);
return bmp;
Однако при загрузке изображений с salir.com я получаю следующий вывод logcat:
13970 Gallery_Activity I Fetching image 2/8 URL: http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
13970 skia D --- decoder->decode returned false
Поиск этого сообщения об ошибке не дал много полезных результатов.
У кого-нибудь есть идея, в чем может быть проблема?
Gracias!
Обновление 1:
После дополнительных запросов и тестирования разных вещей я понял, что проблема, похоже, кроется в другом месте. Хотя мой вывод logcat говорит
13970 ServiceHttpRequest I Image [http://media.salir.com/_images_/verticales/a/0/1/0/2540-los_inmortales_la_trattoria-marc_aureli_27_29_no.jpg] fetched in [146ms]
getContentLength(): 93288
Это правильная длина изображения в байтах. Кажется, что-то не так с потоком или HTTP-соединением.
Мой оригинальный код (выше) использует преимуществаThreadSafeClientConnManager, Если я заменю это простоURLConnection
работает отлично:
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);
Итак, мне интересно, почему мойThreadSafeClientConnManager
работать без нареканий (по крайней мере, так кажется) со всеми другими моими связями (в основном, с обменом)JSONObjects
) но не с изображениями с некоторых конкретных сайтов (например, salir.com - хотя для большинства других сайтов это работает). Я пропускаю параметр HTTP?
Моя текущая настройка:
HttpParams parameters = new BasicHttpParams();
HttpProtocolParams.setVersion(parameters, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(parameters, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(parameters, false); // some webservers have problems if this is set to true
ConnManagerParams.setMaxTotalConnections(parameters, MAX_TOTAL_CONNECTIONS);
HttpConnectionParams.setConnectionTimeout(parameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(parameters, SOCKET_TIMEOUT);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http",
PlainSocketFactory.getSocketFactory(), HTTP_PORT));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
DefaultHttpClient http_client = new DefaultHttpClient(conMgr, parameters);
Обновление 2:
Теперь странно то, что это на самом деле работает сThreadSafeClientConnManager
-иногда-, Если я продолжу пытаться загрузить изображение и расшифровать его пару раз подряд, оно может сработать после 15-30 испытаний. Очень странно.
Я надеюсь, что есть решение, так как я бы предпочел использоватьThreadSafeClientConnManager
вместоURLConnection
.
Обновление 3:
Как предполагает Майк Мошер ниже, кажется, что с помощьюBufferedHttpEntity ошибка декодирования больше не появляется Однако теперь, хотя и реже, чем раньше, я получаюSkImageDecoder::Factory returned null
ошибка.