2011-01-01 22 views
8

Utilicé el siguiente código para obtener la imagen de una url pero no funciona para imágenes grandes.¿Cómo puedo obtener una imagen grande de una url?

¿Me falta algo cuando busco ese tipo de imagen?

imgView = (ImageView)findViewById(R.id.ImageView01); 
    imgView.setImageBitmap(loadBitmap("http://www.360technosoft.com/mx4.jpg")); 

    //imgView.setImageBitmap(loadBitmap("http://sugardaddydiaries.com/wp-content/uploads/2010/12/how_do_i_get_sugar_daddy.jpg")); 
    //setImageDrawable("http://sugardaddydiaries.com/wp-content/uploads/2010/12/holding-money-copy.jpg"); 
    //Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png"); 
    //imgView.setImageDrawable(drawable); 

/* try { 
    ImageView i = (ImageView)findViewById(R.id.ImageView01); 
    Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://sugardaddydiaries.com/wp-content/uploads/2010/12/holding-money-copy.jpg").getContent()); 
    i.setImageBitmap(bitmap); 
    } catch (MalformedURLException e) { 
    System.out.println("hello"); 
    } catch (IOException e) { 
    System.out.println("hello"); 
    }*/ 
    } 


protected Drawable ImageOperations(Context context, String string, 
    String string2) { 
    // TODO Auto-generated method stub 
    try { 
    InputStream is = (InputStream) this.fetch(string); 
    Drawable d = Drawable.createFromStream(is, "src"); 
    return d; 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    return null; 
    } catch (IOException e) { 
    e.printStackTrace(); 
    return null; 
    } 

} 
+0

Estoy bastante seguro de que 'loadBitmap' simplemente descarga el archivo ... sin usar un hilo, ¿estoy en lo cierto? – st0le

Respuesta

5

Usted está tratando de descargar la imagen grande desde dentro de la interfaz de usuario del hilo .... Esto hará que una ANR (La aplicación no responde)

Uso AsyncTask para descargar las imágenes, de esa manera, una Se usará hilo separado para la descarga y el hilo de UI no se bloqueará.

+0

st0le es correcto. Use un AsyncTask ... por ejemplo: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – RyanM

0
 public class MyImageActivity extends Activity 
    { 
     private String image_URL= "http://home.austarnet.com.au/~caroline/Slideshows/Butterfly_Bitmap_Download/slbutfly.bmp"; 

     private ProgressDialog pd; 
     private Bitmap bitmap; 
     private ImageView bmImage; 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 

       bmImage = (ImageView)findViewById(R.id.imageview); 
       pd = ProgressDialog.show(this, "Please Wait", "Downloading Image"); 
       DownloadWebPageTask task = new DownloadWebPageTask(); 
       task.execute(new String[] { image_URL }); 
       // You can also give more images in string array 

     } 
     private class DownloadWebPageTask extends AsyncTask<String, Void, Bitmap> 
     { 
      // String --> parameter in execute 
      // Bitmap --> return type of doInBackground and parameter of onPostExecute 
      @Override 
      protected Bitmap doInBackground(String...urls) { 
       String response = ""; 
       for (String url : urls) 
       { 
        InputStream i = null; 
        BufferedInputStream bis = null; 
        ByteArrayOutputStream out =null; 

//    Only for Drawable Image   
//    try 
//    { 
//     URL url = new URL(image_URL); 
//     InputStream is = url.openStream(); 
//     Drawable d = Drawable.createFromStream(is, "kk.jpg"); 
//     bmImage.setImageDrawable(d); 
//    } 
//   catch (Exception e) { 
//    // TODO: handle exception 
//   } 

// THE ABOVE CODE IN COMMENTS WILL NOT WORK FOR BITMAP IMAGE      

try 
        { 
         URL m = new URL(image_URL); 
         i = (InputStream) m.getContent(); 
         bis = new BufferedInputStream(i, 1024*8); 
         out = new ByteArrayOutputStream(); 
         int len=0; 
         byte[] buffer = new byte[4096]; 
         while((len = bis.read(buffer)) != -1) 
         { 
          out.write(buffer, 0, len); 
         } 
         out.close(); 
         bis.close(); 

        byte[] data = out.toByteArray(); 
        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
        } 

       return bitmap; 
      } 

      @Override 
      protected void onPostExecute(Bitmap result) 
      { 
       if(result!=null) 
       bmImage.setImageBitmap(result); 
       pd.dismiss(); 
      } 
     } 
    } 
2

Si desea descargar la imagen muy rápidamente, puede utilizar AQuery que es similar a jQuery sólo tiene que descargar el android-query.0.15.7.jar

Importe el archivo jar y añadir el siguiente fragmento

AQuery aq = new AQuery(this); 
aq.id(R.id.image).image("http://4.bp.blogspot.com/_Q95xppgGoeo/TJzGNaeO8zI/AAAAAAAAADE/kez1bBRmQTk/s1600/Sri-Ram.jpg"); 

// Here R.id.image is id of your ImageView 
// This method will not give any exception 
// Dont forgot to add Internet Permission 
+0

AQuery es excelente, incluso si solo lo usa para asincrónico obtener imagen vale la pena echarle un vistazo. – scottyab

Cuestiones relacionadas