Android: ошибка с загрузкой изображений ThreadSafeClientConnManager - PullRequest
13 голосов
/ 27 октября 2009

Для моего текущего приложения я собираю изображения из разных "событий провайдеры "в Испании.

  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.

Ответы [ 11 ]

0 голосов
/ 30 октября 2009

У меня была похожая проблема, и корень проблемы был из-за тайм-аутов при запросе некоторых изображений. Я перешел на использование Background Image Loader и с тех пор проблем не было. Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...