Per la mia applicazione corrente raccolgo immagini da diversi "eventi provider" in Spagna.Android: Bug con ThreadSafeClientConnManager download delle immagini
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;
Tuttavia, quando si scaricano le immagini dalla salir.com ottengo il seguente output 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
Una ricerca di quel messaggio di errore non ha fornito risultati molto utili.
Qualcuno ha un'idea di quale potrebbe essere il problema?
Gracias!
Update 1:
Dopo aver contattato un po 'di più e prova cose diverse ho capito che il problema sembra risiedere da qualche altra parte. Anche se la mia uscita logcat dice
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
che è la corretta lunghezza dell'immagine in byte sembra che ci sia qualcosa che non va con la corrente o la connessione HTTP.
Il mio codice originale (sopra) sta sfruttando il ThreadSafeClientConnManager. Se lo sostituisco con un semplice URLConnection
funziona perfettamente:
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
conn.connect();
InputStream instream = conn.getInputStream();
bmp = BitmapFactory.decodeStream(instream);
Quindi, mi chiedo ora perché il mio lavoro in modo impeccabile ThreadSafeClientConnManager
(almeno sembra lo fa) con tutti i miei altri collegamenti (per lo scambio di JSONObjects
) ma non con le immagini di alcuni siti Web specifici (ad es. salir.com - per la maggior parte degli altri siti Web funziona, tuttavia). C'è un parametro HTTP che mi manca?
La mia messa a punto corrente è:
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);
Aggiornamento 2:
Ora, la cosa strana è, che in realtà funziona con la ThreadSafeClientConnManager
-sometimes-. Se continuo a provare a scaricare l'immagine e a decodificarla per un paio di volte di seguito, potrebbe funzionare dopo 15-30 tentativi. Molto strano.
Spero ci sia una soluzione a questo poiché preferirei usare lo ThreadSafeClientConnManager
invece di URLConnection
.
Update 3:
Come suggeriscono da Mike Mosher sotto, sembra che utilizzando BufferedHttpEntity l'errore decodifica non compare più. Tuttavia ora, anche se meno spesso di prima, ottengo un errore SkImageDecoder::Factory returned null
.
Il timeout non sembra essere il problema per me. Come già pubblicato nel mio output logcat, ho recuperato con successo la mia immagine. – znq
Ok, dopo aver fatto qualche altro test sembra che ThreadSafeClientConnManager sia il problema. Tuttavia, non so perché. – znq
Credo che questa risposta faccia riferimento a questo link: http://russenreaktor.wordpress.com/2009/08/11/android-imageloader-load-images-sequencially-in-the-background/ – gregm