which the smooth and fast way to load image from net in android list view!

前端 未结 6 1499
感动是毒
感动是毒 2021-02-06 19:33

i need to list out data from net in that i have 1 image and 2 text. i parse all data and display it but the image displaying very slow in list. so i m looking for best way to do

6条回答
  •  轮回少年
    2021-02-06 20:21

    Please copy the below class . That class is download the images from the web and stores into the memory card or into internal memory of application .

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Stack;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.widget.ImageView;
    
    public class Imageloader 
    {
        // the simplest in-memory cache implementation. This should be replaced with
        // something like SoftReference or BitmapOptions.inPurgeable(since 1.6)
    
        private HashMap cache = new HashMap();
    
        private File cacheDir = null;
        private Bitmap  useThisBitmap = null;
        @SuppressWarnings("unused")
        private Context ctx = null;
    
        public Imageloader(Context context) 
        {
            // Make the background thead low priority. This way it will not affect
            // the UI performance
    
            ctx = context;
            photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1);
    
            // Find the dir to save cached images
            if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
                cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),"DownloadImages/AlbumArt/");
            else
                cacheDir = context.getCacheDir();
    
            if (!cacheDir.exists())
                cacheDir.mkdirs();
        }
    
        public void DisplayImage(String url, Activity activity, ImageView imageView) 
        {
            if(!url.equals(""))
             {
                 if (cache.containsKey(url))
                 {
                     imageView.setImageBitmap(cache.get(url));
                 }
                 else
                 {
                    queuePhoto(url, activity, imageView);
                }
             }
        }
    
        private void queuePhoto(String url, Activity activity, ImageView imageView) 
        {
            // This ImageView may be used for other images before. So there may be
            // some old tasks in the queue. We need to discard them.
    
            photosQueue.Clean(imageView);
            PhotoToLoad p = new PhotoToLoad(url, imageView);
    
            synchronized (photosQueue.photosToLoad) 
            {
                photosQueue.photosToLoad.push(p);
                photosQueue.photosToLoad.notifyAll();
            }
    
            // start thread if it's not started yet
            if (photoLoaderThread.getState() == Thread.State.NEW)
                photoLoaderThread.start();
        }
    
        public Bitmap getBitmap(String url) 
        {
            try
            {
                // I identify images by hashcode. Not a perfect solution, good for the
                // demo.
                String filename = String.valueOf(url.hashCode());
                File f = new File(cacheDir, filename);
    
                // from SD cache
                Bitmap b = decodeFile(f);
                if (b != null)
                    return b;
    
                // from web
                try {
                    Bitmap bitmap = null;       
                    if(!url.equals("")){
                    InputStream is = new URL(url).openStream();
                    OutputStream os = new FileOutputStream(f);
                    Utils.CopyStream(is, os);
                    os.close();
                    bitmap = decodeFile(f);
                    }
                    return bitmap;
                } 
                catch (Exception ex) 
                {
                    ex.printStackTrace();
                return null;
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
    
                return null;    
            }
        }
    
        /*decodes image and scales it to reduce memory consumption
         * @param file path
         * @throws FileNotFoundException
         * @return bitmap
         * */
        private Bitmap decodeFile(File f){
            Bitmap b = null;
            try {
    
                useThisBitmap = null;
                //Decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                final int IMAGE_MAX_SIZE = 70;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);
                int scale = 2;
                if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
                    scale = 2 ^ (int) Math.ceil(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5));
                }
    
                //Decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
    
                o2.inSampleSize = scale;
                b = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
                useThisBitmap = b;
    
            } 
            catch (FileNotFoundException e) {
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                System.gc();
            }
            return useThisBitmap;
        }
    
    
        // Task for the queue
        private class PhotoToLoad 
        {
            public String url;
            public ImageView imageView;
    
            public PhotoToLoad(String u, ImageView i) {
                url = u;
                imageView = i;
            }
        }
    
        private PhotosQueue photosQueue = new PhotosQueue();
    
    
    
        // stores list of photos to download
        private class PhotosQueue 
        {
            private Stack photosToLoad = new Stack();
            // removes all instances of this ImageView
            private void Clean(ImageView image) 
            {
                for (int j = 0; j < photosToLoad.size();) 
                {
                    if (photosToLoad.get(j).imageView == image)
                        photosToLoad.remove(j);
                    else
                        ++j;
                }
            }
        }
    
        private class PhotosLoader extends Thread 
        {
            public void run() 
            {
                try 
                {
                    while (true) 
                    {
                        // thread waits until there are any images to load in the
                        // queue
                        if (photosQueue.photosToLoad.size() == 0)
                            synchronized (photosQueue.photosToLoad) {
                                photosQueue.photosToLoad.wait();
                            }
                        if (photosQueue.photosToLoad.size() != 0) {
                            PhotoToLoad photoToLoad;
                            synchronized (photosQueue.photosToLoad) {
                                photoToLoad = photosQueue.photosToLoad.pop();
                            }
                            Bitmap bmp = getBitmap(photoToLoad.url);
                            cache.put(photoToLoad.url, bmp);
                            if (((String) photoToLoad.imageView.getTag())
                                    .equals(photoToLoad.url)) {
                                BitmapDisplayer bd = new BitmapDisplayer(bmp,
                                        photoToLoad.imageView);
                                Activity a = (Activity) photoToLoad.imageView
                                        .getContext();
                                a.runOnUiThread(bd);
                            }
                        }
                        if (Thread.interrupted())
                            break;
                    }
                } catch (InterruptedException e) {
                    // allow thread to exit
                }
            }
        }
    
        private PhotosLoader photoLoaderThread = new PhotosLoader();
    
        // Used to display bitmap in the UI thread
        private class BitmapDisplayer implements Runnable 
        {
            private Bitmap bitmap;
            private ImageView imageView;
    
            private BitmapDisplayer(Bitmap b, ImageView i) 
            {
                bitmap = b;
                imageView = i;
            }
    
            public void run() 
            {
                if (bitmap != null)
                    imageView.setImageBitmap(bitmap);
            }
        }
    
        public void stopThread() 
        {
            photoLoaderThread.interrupt();
        }
    
        public void clearCache() 
        {
            cache.clear();
            File[] files = cacheDir.listFiles();
            for (File f : files)
                f.delete();
        }
    }
    

    Example

    First create your image Loader class object.

    Imageloader imageLoader = new Imageloader(getApplicationContext());
    

    then set the image url into the imageview's setTag Property.

    imgImageView.setTag(Your Image Url);
    

    then call your ImageLoader class Display image function . There are 3 parameters required.

    1) Image Url

    2) Your Current Class Name

    3) ImageView

    imageLoader.DisplayImage(Your Image Url,ClassName.this,imgImageView);
    

    this functon dowload images from the web and stored into the memory and show from the memory.

提交回复
热议问题