Android: Fehler beim Herunterladen von Bildern durch ThreadSafeClientConnManager

Für meine aktuelle Bewerbung sammle ich Bilder von verschiedenen "Eventanbietern" in Spanien.

  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;

Beim Herunterladen von Bildern von salir.com erhalte ich jedoch die folgende Logcat-Ausgabe:

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

Eine Suche nach dieser Fehlermeldung lieferte nicht viele nützliche Ergebnisse.

Hat jemand eine Idee woran das liegen könnte?

Gracias!

Update 1:

Nachdem ich ein bisschen mehr nachgefragt und verschiedene Sachen ausprobiert hatte, stellte ich fest, dass das Problem woanders zu liegen scheint. Auch wenn meine Logcat-Ausgabe sagt

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

Das ist die richtige Länge des Bildes in Bytes. Es scheint, dass etwas mit dem Stream oder der HTTP-Verbindung nicht stimmt.

Mein ursprünglicher Code (oben) nutzt dieThreadSafeClientConnManager. Wenn ich es nur durch ein einfaches ersetzeURLConnection es funktioniert perfekt:

URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);

Ich frage mich jetzt, warum meine?ThreadSafeClientConnManager Arbeite einwandfrei (zumindest scheint es so) mit all meinen anderen Verbindungen (meistens tauschend)JSONObjects), jedoch nicht mit Bildern von bestimmten Websites (z. B. salir.com - bei den meisten anderen Websites funktioniert dies jedoch). Gibt es einen HTTP-Parameter, den ich vermisse?

Mein aktuelles Setup ist:

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);

Update 2:

Nun ist das Seltsame, dass es tatsächlich mit dem funktioniertThreadSafeClientConnManager -manchmal-. Wenn ich weiterhin versuche, das Bild herunterzuladen und es einige Male hintereinander zu dekodieren, funktioniert es möglicherweise nach 15 bis 30 Versuchen. Sehr eigenartig.

Ich hoffe, dass es eine Lösung dafür gibt, da ich es vorziehen würde, die zu verwendenThreadSafeClientConnManager anstattURLConnection.

Update 3:

Wie von Mike Mosher unten vorgeschlagen, scheint es, dass durch die Verwendung vonBufferedHttpEntity dasDekodierungsfehler erscheint nicht mehr. Aber jetzt, obwohl seltener als zuvor, bekomme ich eineSkImageDecoder::Factory returned null Error.

Antworten auf die Frage(11)

Ihre Antwort auf die Frage