2010-12-11 9 views
8

Intento cargar una imagen remota desde un servidor y gracias a una gran cantidad de ejemplos de código en stackoverflow tengo una solución que funciona en 2 de 3 imágenes. Realmente no sé cuál es el problema con la tercera imagen y, a veces, cuando dejo que el código se ejecute en el depurador, la imagen se está cargando. Además, si cargué la imagen problemática primero, las otras dos imágenes a veces no se cargan.BitmapFactory.decodeStream devuelve nulo sin excepción

Aquí está el código:

public static Drawable getPictureFromURL(Context ctx, String url, final int REQUIRED_SIZE) throws NullPointerException { 
    //Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    int scale = 1; 
    if (o.outWidth > REQUIRED_SIZE) { 
     scale = (int) Math.pow(2, (int) Math.round(Math.log(REQUIRED_SIZE/(double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
    } 
    Log.i(Prototype.TAG, "scale: "+scale); 

    //Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    Bitmap bmp; 
    try { 
     bmp = BitmapFactory.decodeStream((InputStream) Tools.fetch(url), null, o2); 
     if(bmp!=null) 
      return new BitmapDrawable(ctx.getResources(), bmp); 
     else 
      return null; 
    } catch (Exception e) { 
     Log.e(Prototype.TAG, "Exception while decoding stream", e); 
     return null; 
    } 
} 

durante la depuración descubrí que o.outWidth es -1, que indica un error, pero no es una excepción es lanzada, por lo que no se puede decir lo que salió mal. El InputStream siempre devolvió un valor válido, y sé que la imagen existe en el servidor.

mejores deseos, Daniel

Respuesta

16

he encontrado la respuesta here y actualizó el método fetch a:

private static InputStream fetch(String address) throws MalformedURLException,IOException { 
    HttpGet httpRequest = new HttpGet(URI.create(address)); 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpResponse response = (HttpResponse) httpclient.execute(httpRequest); 
    HttpEntity entity = response.getEntity(); 
    BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity); 
    InputStream instream = bufHttpEntity.getContent(); 
    return instream; 
} 
+0

1, pero parece ahora que las imágenes se descargan de forma secuencial en lugar de en paralelo (Estoy dl-ing cada imagen en una AsyncTask separada). Al menos funciona ... – kellogs

Cuestiones relacionadas