How to set image from Url using AsyncTask?

后端 未结 7 1338
青春惊慌失措
青春惊慌失措 2021-02-06 14:18

I\'m a newbie programmer an I\'m making an android program that displays an image on ImageView from a given url. My problem is how do you use this on the AsyncTask?

Thes

7条回答
  •  無奈伤痛
    2021-02-06 14:45

    based on the answer from comeGetSome i created my own implementation which works with normal ImageView class instead of creating a new class UrlImageView, also new options are provided like - what to do when the loading completes or cancels

    Now load image as you want, like this from any of the three loadImage methods

           UrlImageLoader urlImageLoader=new UrlImageLoader();
           ImageView imageView=new ImageView(context);
           //load and set the image to ImageView
           urlImageLoader.loadImage(imageView, "http://www......com/.....jpg");
           //for loading a image only - load image and do any thing with the bitmap
           urlImageLoader.loadImage("http://www......com/.....jpg", new UrlImageLoader.OnLoadingCompleteListener() {
    
                @Override
                public void onComplete(ImageView imageView, Bitmap bmp) {
                    // do anything with the Bitmap
                    // here imageView will be null
                }
                @Override
                public void onCancel(ImageView imageView) {
    
                }
            });
           urlImageLoader.loadImage(imageView, "http://www......com/.....jpg", new UrlImageLoader.OnLoadingCompleteListener() {
    
                @Override
                public void onComplete(ImageView imageView, Bitmap bmp) {
                    // do anything with the Bitmap
                    // here imageView is not null
                    imageView.setImageBitmap(bmp);
                }
                @Override
                public void onCancel(ImageView imageView) {
    
                }
            });
    

    create this class for loading UrlImageLoader

    /*special thanks to stackoverflow.com user comeGetSome for UrlImageLoadingTask code
     * question - http://stackoverflow.com/questions/14332296/how-to-set-image-from-url-using-asynctask/15797963
     * comeGetSome - http://stackoverflow.com/users/1005652/comegetsome
     */
    package com.GameG.SealTheBox;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.ImageView;
    
    public class UrlImageLoader {
        public static interface OnLoadingCompleteListener {
            public void onComplete(ImageView imageView, Bitmap bmp);
            public void onCancel(ImageView imageView);
        }
        ArrayList loadingList=new ArrayList();
        /**
         * Loads a image from url and calls onComplete() when finished
    * @Note you should manually set the loaded image to ImageView in the onComplete() * @param imageView * @param url * @param onComplete */ public void loadImage(ImageView imageView, String url, OnLoadingCompleteListener onComplete){ try { URL url2=new URL(url); if(imageView!=null){ for(int i=0;i0){ UrlImageLoadingTask tmptask=loadingList.get(0); loadingList.remove(tmptask); tmptask.cancel(true); } } private class UrlImageLoadingTask extends AsyncTask { public ImageView updateView=null; public String url; private boolean isCancelled = false; private InputStream urlInputStream; private OnLoadingCompleteListener onComplete=null; private UrlImageLoadingTask(ImageView updateView, OnLoadingCompleteListener onComplete, String url) { this.updateView=updateView; this.onComplete=onComplete; this.url=url; } @Override protected Bitmap doInBackground(URL... params) { try { URLConnection con = params[0].openConnection(); // can use some more params, i.e. caching directory etc con.setUseCaches(true); this.urlInputStream = con.getInputStream(); return BitmapFactory.decodeStream(urlInputStream); } catch (IOException e) { Log.w(UrlImageView.class.getName(), "failed to load image from " + params[0], e); return null; } finally { if (this.urlInputStream != null) { try { this.urlInputStream.close(); } catch (IOException e) { ; // swallow } finally { this.urlInputStream = null; } } } } @Override protected void onPostExecute(Bitmap result) { if (!this.isCancelled) { // hope that call is thread-safe if(onComplete==null){ if(updateView!=null) this.updateView.setImageBitmap(result); }else{ onComplete.onComplete(updateView, result); } } loadingList.remove(this); } /* * just remember that we were cancelled, no synchronization necessary */ @Override protected void onCancelled() { this.isCancelled = true; try { if (this.urlInputStream != null) { try { this.urlInputStream.close(); } catch (IOException e) { ;// swallow } finally { this.urlInputStream = null; } } } finally { super.onCancelled(); if(onComplete!=null) onComplete.onCancel(updateView); loadingList.remove(this); } } } }

提交回复
热议问题