2011-01-01 11 views
8

Ho usato il codice qui sotto per recuperare l'immagine da un URL ma non funziona per immagini di grandi dimensioni.Come posso recuperare un'immagine grande da un URL?

Mi manca qualcosa durante il recupero di questo tipo di immagine?

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

Sono quasi sicuro che 'loadBitmap' scarica semplicemente il file ... senza usare una discussione, ho ragione? – st0le

risposta

5

Stai cercando di scaricare il Grande immagine dall'interno del thread dell'interfaccia utente .... Questo causerà un ANR (applicazione non risponde)

Usa AsyncTask per scaricare le immagini, in questo modo, un verrà utilizzato un thread separato per il download e il thread UI non verrà bloccato.

+0

st0le ha ragione. Usa un AsyncTask ... per esempio: 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

Se volete scaricare l'immagine molto velocemente quindi è possibile utilizzare AQuery che è simile a JQuery basta scaricare il android-query.0.15.7.jar

Importare il file jar e aggiungere il seguente frammento

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 è eccellente, anche se si usa solo per async vale la pena provare a vederlo. – scottyab

Problemi correlati