Загрузка изображений Android - PullRequest
3 голосов
/ 26 мая 2010

Какой самый простой способ получить изображение с URL-адреса в программе Android?

Ответы [ 2 ]

6 голосов
/ 26 мая 2010

Я бы настоятельно рекомендовал вместо этого использовать AsyncTask . Первоначально я использовал URL.openStream , но у него есть проблем .

class DownloadThread extends AsyncTask<URL,Integer,List<Bitmap>>{
 protected List<Bitmap> doInBackground(URL... urls){
  InputStream rawIn=null;
  BufferedInputStream bufIn=null;
  HttpURLConnection conn=null;
  try{
   List<Bitmap> out=new ArrayList<Bitmap>();
   for(int i=0;i<urls.length;i++){
    URL url=urls[i];
    url = new URL("http://mysite/myimage.png");
    conn=(HttpURLConnection) url.openConnection()
    if(!String.valueOf(conn.getResponseCode()).startsWith('2'))
      throw new IOException("Incorrect response code "+conn.getResponseCode()+" Message: " +getResponseMessage());
    rawIn=conn.getInputStream();
    bufIn=new BufferedInputStream();
    Bitmap b=BitmapFactory.decodeStream(in);
    out.add(b);
    publishProgress(i);//Remove this line if you don't want to use AsyncTask
  }
    return out;
  }catch(IOException e){
    Log.w("networking","Downloading image failed");//Log is an Android specific class
    return null;
  }
  finally{
   try {
     if(rawIn!=null)rawIn.close();
     if(bufIn!=null)bufIn.close();         
     if(conn!=null)conn.disconnect();
   }catch (IOException e) {
     Log.w("networking","Closing stream failed");
   }
  }
 }
}

В этом случае трудно закрыть поток / соединение и обработку исключений. Согласно Sun Documentation вам нужно только закрыть самый внешний поток, однако кажется, что он более сложный . Однако сначала я закрываю самый внутренний поток, чтобы убедиться, что он закрыт, если мы не можем закрыть BufferedInputStream.

Мы закрываем в конце, чтобы исключение не мешало их закрытию. Мы учитываем возможность того, что потоки будут null, если исключение помешало их инициализации. Если у нас есть исключение во время закрытия, мы просто регистрируем и игнорируем это. Даже это может не работать должным образом, если возникает ошибка во время выполнения.

Вы можете использовать класс AsyncTask следующим образом. Запустите анимацию в onPreExecute. Обновите прогресс в onProgressUpdate. onPostExecute должен обрабатывать фактические изображения. Используйте onCancel, чтобы позволить пользователю отменить операцию. Начните с AsyncTask.execute.

Стоит отметить, что исходный код и лицензия позволяют нам использовать этот класс в проектах, отличных от Android.

3 голосов
/ 26 мая 2010

Вы делаете это разными способами, но я могу представить себе более простой способ:

Bitmap IMG;
Thread t = new Thread(){
    public void run(){
    try {
        /* Open a new URL and get the InputStream to load data from it. */ 
        URL aURL = new URL("YOUR URL"); 
    URLConnection conn = aURL.openConnection(); 
    conn.connect(); 
    InputStream is = conn.getInputStream(); 
    /* Buffered is always good for a performance plus. */ 
    BufferedInputStream bis = new BufferedInputStream(is); 
    /* Decode url-data to a bitmap. */ 
    IMG = BitmapFactory.decodeStream(bis);
    bis.close(); 
    is.close(); 

    // ...send message to handler to populate view.
    mHandler.sendEmptyMessage(0);

} catch (Exception e) {
    Log.e(DEB, "Remtoe Image Exception", e);

    mHandler.sendEmptyMessage(1);
} finally {
}
}
};

t.start();

А затем добавьте обработчик в ваш код:

    private Handler mHandler = new Handler(){
    public void handleMessage(Message msg) {
        switch(msg.what){
        case 0:
            (YOUR IMAGE VIEW).setImageBitmap(IMG);
            break;
        case 1:
            onFail();
            break;
        }
    }
};

Запустив поток и добавив обработчик, вы можете загружать изображения без блокировки интерфейса во время загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...