Android下载图片 图片的异步加载 和缓存存取

一、创建异步任务

public class LoadBitmapAsyn extends AsyncTask<String,Void,Bitmap> {

    Context context;
    ImageView img;
    private HashMap<String,SoftReference<Bitmap>> imageCache=null;
    public LoadBitmapAsyn(ImageView img){
        this.img=img;
        this.context=context;
    }
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        imageCache=new HashMap<String,SoftReference<Bitmap>>();
    }

    @Override
    protected Bitmap doInBackground(String... strings) {

            try {
		//获取到网络数据,返回bitmap
                InputStream in = new URL(strings[0]).openStream();
                Bitmap bitmap1 = BitmapFactory.decodeStream(in);
		//存储到手机内存的指定位置
                File dir = new File(Environment.getExternalStorageDirectory() + "/test/");
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File bitmapFile = new File(Environment.getExternalStorageDirectory() + "/test/" +
                        strings[0].substring(strings[0].lastIndexOf("/") + 1));
                if (!bitmapFile.exists()) {
                    try {
                        bitmapFile.createNewFile();
                    } catch (IOException e) {
//TODOAuto-generatedcatchblock
                        e.printStackTrace();
                    }
                }
                FileOutputStream fos;
                try {
                    fos = new FileOutputStream(bitmapFile);
                    bitmap1.compress(Bitmap.CompressFormat.PNG,
                            100, fos);
                    fos.close();
                } catch (FileNotFoundException e) {

                    e.printStackTrace();
                } catch (IOException e) {

                    e.printStackTrace();
                }

                return bitmap1;
            } catch (Exception e) {
                int i = 1 + 1;
            }

        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {

        super.onPostExecute(bitmap);
        img.setImageBitmap(bitmap);
    }

}

二、activity中检测缓存中是否有盖图片,优先加载内存缓存,其次是内部存储,最后才是网上下载

//检测缓存和内存中是否有指定路径名的bitmap数据
 public Bitmap loadBitmap(final String imageURL){
        imageCache=new HashMap<String,SoftReference<Bitmap>>();
	//在内存缓存中,则返回Bitmap对象
        if (imageCache.containsKey(imageURL)) {
            SoftReference<Bitmap> reference = imageCache.get(imageURL);
            Bitmap bitmap = reference.get();
            if (bitmap != null) {
                return bitmap;
            }
        } else {
	/**
	 *加上一个对本地缓存的查找
	 */	
		//提取图片名字
            String bitmapName = imageURL.substring(imageURL.lastIndexOf("/") + 1);
            File cacheDir = new File(Environment.getExternalStorageDirectory()+"/test/");
            File[] cacheFiles = cacheDir.listFiles();
            int i = 0;
            if (null != cacheFiles) {
                for (; i < cacheFiles.length; i++) {
                    if (bitmapName.equals(cacheFiles[i].getName())) {
                        break;
                    }
                }
                if (i < cacheFiles.length) {
                    return BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/test/" + bitmapName);
                }
            }
        }
        return null;
    }

三、activity中的调用

Bitmap bitmap = loadBitmap(url);
ImageView img = new ImageView(yourActivity);
if (bitmap2 != null) {
    img.setImageBitmap(bitmap2);
} else {
    LoadBitmapAsyn loadBitmapAsyn = new LoadBitmapAsyn(imageView);
    loadBitmapAsyn.execute(url);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 20:43:43

Android下载图片 图片的异步加载 和缓存存取的相关文章

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

android Listview 软引用SoftReference异步加载图片

首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以图片失真比较严重,对于对图片质量要求很高的应用,可以采用下面的方法 /** *按照图片路径加载 *@param path图片资源的存放路径 *@param scalSize缩小的倍数 *@return */ public static Bitmap loadResBitmap(String path

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

ListView异步加载 LruCache缓存 滑动状态监听

Android异步加载的总结.除了LruCache,我们还可以使用DiskLruCache这个第三方的类来实现"二级缓存".异步加载不仅仅是获取网络资源,我们可以加所有耗时的操作都看成异步加载,所有通过耗时的操作获取的结果我们都可以通过缓存来提高效率,比如我们可以利用这里的LruCache和DiskLruCache(这个缓存一般是用于缓存从网络获取的图片,视频等大的资源,这个时候我们一般和LruCache结合使用),使用Cache有个缺点,就是我们不能保证我们的数据是实时的,所以在re

【Android】ListView、RecyclerView异步加载图片引起错位问题

今天在RecyclerView列表里遇到一个情况,它包含300条数据,每项包含一个图片,发现在首次载入时,由于本地没图,请求网络的时候:快速滑动导致了图片错位.闪烁的问题. 原理的话有一篇已经说的很清楚了,大家可以参考下 下面是讲讲实际使用中,是怎么解决错位的问题. 一般错位都是发生在耗时的http请求上面,因此,针对每次图片请求 发起前 1:先将图片预设为本地一个占位图片.(重要!很多错位情况在于复用了其他位置的图片缓存,而当前图片迟迟加载不出来,导致当前图片错位.所以解决之道是先用本地占位图

Android图片异步加载之Android-Universal-Image-Loader类库的使用

Android开发中我们会经常遇到图片过多或操作不当造成Out of Memory异常,有时虽然是解决了这个问题但却会影响程序的运行效率,例如:当用户在快速滑动滚动条的过程中,我们程序在仍在艰难的加载服务器端的图片,这样给用户造成了极不好的体验.其实网络上关于图片的异步加载和缓存的讲解很多,但是其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面,针对这一广大开发者都会遇到的问题,一些牛人们已经帮我们解决了这一问题,今天我为大家介绍一款很流行的开源类库,可以很很好的解决

Android图片异步加载

原:http://www.cnblogs.com/angeldevil/archive/2012/09/16/2687174.html 相关:https://github.com/nostra13/Android-Universal-Image-Loader 开发Android程序,一般情况下都会有两个操作,图片的异步加载与缓存,而图片的异步加载大都是从网络读取图片(还有生成本地图片缩略图等操作),为了减少网络操作,加快图片加载速度就需要对图片进行缓存,所以网上的好多图片异步加载方法都是与图片的

Android图片异步加载框架Android-Universal-Image-Loader

Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个Android开源项目之一,主流的应用,随便反编译几个,都可以见到它的身影.淘宝,天猫,Facebook,京东商城等都用到了这个项目. 该项目的Github地址链接:https://github.com/nostra13/Android-Universal-Image-Loader 运行流程: 每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片

Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)

这个图片异步加载并缓存的类已经被很多开发者所使用,是最常用的几个开源库之一,主流的应用,随便反编译几个火的项目,都可以见到它的身影. 可是有的人并不知道如何去使用这库如何进行配置,网上查到的信息对于刚接触的人来说可能太少了,下面我就把我使用过程中所知道的写了下来,希望可以帮助自己和别人更深入了解这个库的使用和配置. GITHUB上的下载路径为:https://github.com/nostra13/Android-Universal-Image-Loader ,下载最新的库文件,并且导入到项目的