2011-12-07 34 views
5

he visto esta pregunta: android how to download an 1mb image file and set to ImageView
No resuelve mi problema, ya que sólo muestra cómo mostrar el mapa de bits después ya lo tienes.para imageview en Android

Estoy tratando de descargar una imagen de una URL para que se muestre con un ImageView en un dispositivo Android. No estoy seguro de cómo hacer esto.

He mirado todo un poco en internet, este es el código que tengo hasta ahora:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    //Set local image 
    ImageView image = (ImageView) findViewById(R.id.test_image); 
    image.setImageResource(R.drawable.test2); 

    //Prepare to download image 
    URL url;   
    InputStream in; 

    //BufferedInputStream buf; 
    try { 
     url = new URL("http://i.imgur.com/CQzlM.jpg"); 
     in = url.openStream(); 

     out = new BufferedOutputStream(new FileOutputStream("testImage.jpg")); 
     int i; 

     while ((i = in.read()) != -1) { 
      out.write(i); 
     } 
     out.close(); 
     in.close(); 

     buf = new BufferedInputStream(in); 
     Bitmap bMap = BitmapFactory.decodeStream(buf); 
     image.setImageBitmap(bMap); 
     if (in != null) { 
     in.close(); 
     } 
     if (buf != null) { 
     buf.close(); 
     } 
    } catch (Exception e) { 
     Log.e("Error reading file", e.toString()); 
    } 
} 
+0

Si has encontrado una respuesta, debería aceptarlo De esa forma, otros usuarios saben que funciona. ¡Buena suerte! – Entreco

Respuesta

10

El código probablemente funcionaría, alltough va a descargar su imagen en el hilo principal. Esto significa que cuando se tarden más de 5 segundos en descargarse, se le presentará el famoso cuadro de diálogo ANR y su aplicación se bloqueará ...

Debe descargar su imagen en una secuencia de fondo y publicar el resultado a tu hilo principal De vuelta en el hilo principal, puede actualizar su imagen con la imagen descargada.

He aquí un ejemplo:

package nl.entreco.stackoverflow; 

import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.URL; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ImageView; 

public class StackOverflowActivity extends Activity { 

// 
private ImageView mImageView; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Find the reference to the ImageView 
    mImageView = (ImageView) findViewById(R.id.test_image); 

    // You can set a temporary background here 
    //image.setImageResource(null); 

    // Start the DownloadImage task with the given url 
    new DownloadImage().execute("http://i.imgur.com/CQzlM.jpg"); 
} 


/** 
* Simple functin to set a Drawable to the image View 
* @param drawable 
*/ 
private void setImage(Drawable drawable) 
{ 
    mImageView.setBackgroundDrawable(drawable); 
} 

public class DownloadImage extends AsyncTask<String, Integer, Drawable> { 

    @Override 
    protected Drawable doInBackground(String... arg0) { 
     // This is done in a background thread 
     return downloadImage(arg0[0]); 
    } 

    /** 
    * Called after the image has been downloaded 
    * -> this calls a function on the main thread again 
    */ 
    protected void onPostExecute(Drawable image) 
    { 
     setImage(image); 
    } 


    /** 
    * Actually download the Image from the _url 
    * @param _url 
    * @return 
    */ 
    private Drawable downloadImage(String _url) 
    { 
     //Prepare to download image 
     URL url;   
     BufferedOutputStream out; 
     InputStream in; 
     BufferedInputStream buf; 

     //BufferedInputStream buf; 
     try { 
      url = new URL(_url); 
      in = url.openStream(); 

      /* 
      * THIS IS NOT NEEDED 
      * 
      * YOU TRY TO CREATE AN ACTUAL IMAGE HERE, BY WRITING 
      * TO A NEW FILE 
      * YOU ONLY NEED TO READ THE INPUTSTREAM 
      * AND CONVERT THAT TO A BITMAP 
      out = new BufferedOutputStream(new FileOutputStream("testImage.jpg")); 
      int i; 

      while ((i = in.read()) != -1) { 
       out.write(i); 
      } 
      out.close(); 
      in.close(); 
      */ 

      // Read the inputstream 
      buf = new BufferedInputStream(in); 

      // Convert the BufferedInputStream to a Bitmap 
      Bitmap bMap = BitmapFactory.decodeStream(buf); 
      if (in != null) { 
       in.close(); 
      } 
      if (buf != null) { 
       buf.close(); 
      } 

      return new BitmapDrawable(bMap); 

     } catch (Exception e) { 
      Log.e("Error reading file", e.toString()); 
     } 

     return null; 
    } 

} 

} 

No se olvide de añadir el permission.INTERNET a su manifiesto, en caso contrario, obtendrá un error ...

+0

Intenté esto. No da errores, pero la imagen no se cargará. El permiso de Internet ** está ** presente en el archivo AndroidManifest.xml. ¿Podría esto tener algo que ver con la clase DownloadImage dentro de la otra clase? – Koen027

+0

No importa, cambié el código un poco y funcionó. En la función setImage, cambié la única línea a: 'mImageView.setImageDrawable (dibujable);' – Koen027

+0

Yar, perdón por la espera. Se olvidó de esto después de probarlo. – Koen027