图片异步加载和图片缓存的两种方式

,首先定义个工具类:

 
 /*
 * 异步的任务 ,接受的参数是 要下载图片的url
 * 返回值 是这个图片 的bitMap
 */

public class LoadImageAsyncTask extendsAsyncTask<String, Void, Bitmap> {
 
    // 定义一个接口 ,接口里面包含了几个需要实现的方法
    // 谁调用 LoadImageAsyncTask 就必须实现这个接口里面定义的方法 
    privateLoadImageCallback loadImageCallback;
     
     
    //因为LoadImageAsyncTask 没有默认的空参数的构造方法 
    publicLoadImageAsyncTask(LoadImageCallback loadImageCallback) {
        this.loadImageCallback = loadImageCallback;
    }
 
    publicinterface LoadImageCallback{
        //当图片被加载上来需要执行的方法
        voidonImageLoaded(Bitmap bitmap);
        // 在图片下载之前需要执行的方法
        voidbeforeImageLoaded();
    }
     
    <span data-mce-="">// 在后台运行 非ui线程 </span>
    // 可变长度的参数  其实就是 parms的数组
    @Override
    protectedBitmap doInBackground(String... params) {
        try{
            //获取可变长度参数的第一个参数的string 代表的是 图片的地址
            String iconpath = params[0];
            URL url =new URL(iconpath);
            URLConnection conn = url.openConnection();
            Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            returnbitmap;
        }catch (Exception e) {
            e.printStackTrace();
            returnnull;
        }
    }
    // 后台任务执行前的操作
    <span data-mce-="">//运行在ui线程中的</span>
    @Override
    protectedvoid onPreExecute() {
        loadImageCallback.beforeImageLoaded();
        super.onPreExecute();
    }
 
    // 后台任务执行完毕后的操作
    <span data-mce-="">// 运行在ui线程中</span>
    @Override
    protectedvoid onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        // 需要把bitmap 设置到某个控件上 
        loadImageCallback.onImageLoaded(result);
    }
}
?
AsyncTask<Params, Progress, Result>泛型里面的参数是可以改变的,如这个工具类第一个参数就是图片的路径,第二个参数就是执行的进度,第三个参数是返回是BitMap
?
if (map.containsKey(iconname)) {
                // 如果map集合中存在软引用的对象
                SoftReference<Bitmap> obj = map.get(iconname);
                Bitmap bitmap = obj.get();
                iv_book.setImageBitmap(bitmap);
                Log.i("MyReadActivity","使用内存缓存");
            }else {
                LoadImageAsyncTask task =new LoadImageAsyncTask(
                        newLoadImageCallback() {
                            publicvoid onImageLoaded(Bitmap bitmap) {
                                iv_book.setImageBitmap(bitmap);
                                // <span data-mce-="">保存到sd卡上</span>  缓存方式1
                                /*
                                 * try { File file = new File(Environment
                                 * .getExternalStorageDirectory(), "/image" +
                                 * iconname); FileOutputStream fos = new
                                 * FileOutputStream( file); // 把内存中的图片保存到了sd卡中
                                 * bitmap.compress(CompressFormat.JPEG, 100,
                                 * fos); } catch (Exception e) {
                                 * e.printStackTrace(); }
                                 */
                                // <span data-mce-="">把图片保存到内存中</span>  缓存方式2
                                map.put(iconname,new <span data-mce-="">SoftReference</span><Bitmap>(
                                        bitmap));
                                Log.i("MyReadActivity","把图片存放到内存缓存中 ");
                            }
 
                            publicvoid beforeImageLoaded() {
                                iv_book.setImageResource(R.drawable.book);
                                Log.i("MyReadActivity","下载服务器图片 ");
                            }
                        });
                // 异步的从服务器上下载图片
                task.execute(path);
            }





你可能感兴趣的:(图片异步加载和图片缓存的两种方式)