码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-07 01:52:50      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:android   asyntask   异步任务   下载图片   缓存   

一、创建异步任务

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);
}

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

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

标签:android   asyntask   异步任务   下载图片   缓存   

原文地址:http://blog.csdn.net/u010184245/article/details/47326971

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!