Android -- ImageLoader的详细使用

一、介绍

ImageLoader的工作原理是这样的:在显示图片的时候,它会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。 
基于这个原理,我们可以在每一次退出一个页面的时候,把ImageLoader内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。 
此外,由于ImageLoader对图片是软引用的形式,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收)。

ImageLoader的三大组件:
① ImageLoaderConfiguration——对图片缓存进行总体配置,包挎内存缓存的大小、本地缓存的大小和位置、日志、下载策略(FIFO还是LIFO)等等。
② ImageLoader——我们一般使用displayImage来把URL对应的图片显示在ImageView上。
③ ImageLoaderOptions——在每个页面需要显示图片的地方,控制如何显示的细节,比如指定下载时的默认图(包括下载中、下载失败、URL为空等),是否将缓存放到内存或者本地磁盘。

二、使用

(1)导包和权限

implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

(2)在application中onCreate()初始化配置:

 


DisplayImageOptions options = new DisplayImageOptions.Builder()
        .cacheInMemory(false) //设置下载的图片是否缓存在内存中
        .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
        .showImageOnLoading(R.mipmap.notice_image_bg)
        .showImageOnFail(R.mipmap.notice_image_bg)
        .bitmapConfig(Bitmap.Config.RGB_565)
        .considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转)
        .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
        .build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
        .memoryCacheExtraOptions(480, 800) // max width, max height,即保存的每个缓存文件的最大长宽
        .threadPoolSize(3) //线程池内加载的数量
        .threadPriority(Thread.NORM_PRIORITY - 2)
        .denyCacheImageMultipleSizesInMemory()
        .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //将保存的时候的URI名称用MD5 加密
        .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现
        .memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
        .diskCacheSize(50 * 1024 * 1024)  // 50 Mb sd卡(本地)缓存的最大值
        .tasksProcessingOrder(QueueProcessingType.LIFO)
        .defaultDisplayImageOptions(options)// 由原先的discCache -> diskCache
        .diskCache(new UnlimitedDiskCache(new File(path)))//自定义缓存路径
        .imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
        .writeDebugLogs() // Remove for release app
        .build();
ImageLoader.getInstance().init(config);//全局初始化此配置

(3)在使用ImageView加载图片的地方,配置当前页面的ImageLoader选项。有可能是Activity,也有可能是Adapter。我这个demo是在adapter里面配置DisplayImageOptions对象。代码如下所示:

public class MainActivity extends Activity {

    // 创建ImageLoader对象
    private ImageLoader imageLoader = ImageLoader.getInstance();
    private ListView lsv_image_loader;
    // 网络图片的URL和drawable下的图片,其他的图片(比如手机本地)的URL看我博客有写,这里没有全部给出,大家可以自己去试试看。
    private String[] picture_uri = new String[] {
            "http://pic2.16pic.com/00/15/80/16pic_1580359_b.jpg",
            "http://pic.58pic.com/58pic/14/21/47/26t58PICywd_1024.jpg",
            "http://pic.58pic.com/58pic/14/21/42/15T58PICe3i_1024.jpg",
            "http://pic.58pic.com/58pic/14/21/44/52758PICtw2_1024.jpg",
            "http://pic.58pic.com/58pic/14/21/32/81U58PICJqm_1024.jpg",
            "http://pic.58pic.com/58pic/14/21/37/46B58PICudW_1024.jpg",
            "http://pic.58pic.com/58pic/14/21/39/72g58PICd3K_1024.jpg",
            "http://img15.3lian.com/2015/f3/08/d/02.jpg",
            "http://pic.58pic.com/58pic/14/21/47/99N58PICE7q_1024.jpg",
            "drawable://" + R.drawable.png_11 };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置该Activity使用的布局文件
        setContentView(R.layout.activity_main);
        // 获取ListView控件
        lsv_image_loader = (ListView) findViewById(R.id.lsv_image_loader);
        // 创建ImageLoaderBaseAdapter对象
        ImageLoaderBaseAdapter adapter = new ImageLoaderBaseAdapter(this);
        // listView设置adapter
        lsv_image_loader.setAdapter(adapter);
    }

    /**
     * 自定义ImageLoaderBaseAdapter继承BaseAdapter,重写相关方法
     * @author 邹奇
     *
     */
    class ImageLoaderBaseAdapter extends BaseAdapter {

        private LayoutInflater inflater;

        public ImageLoaderBaseAdapter(Context context) {
            this.inflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return picture_uri.length;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return picture_uri[position];
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.lsv_item_image_loader,
                        null);
                holder = new ViewHolder();
                holder.iv_lin = (ImageView) convertView
                        .findViewById(R.id.iv_lin);
                convertView.setTag(holder);
            }
            holder = (ViewHolder) convertView.getTag();
            // 创建DisplayImageOptions对象并进行相关选项配置
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .showImageOnLoading(R.drawable.ic_launcher)// 设置图片下载期间显示的图片
                    .showImageForEmptyUri(R.drawable.ic_launcher)// 设置图片Uri为空或是错误的时候显示的图片
                    .showImageOnFail(R.drawable.ic_launcher)// 设置图片加载或解码过程中发生错误显示的图片
                    .cacheInMemory(true)// 设置下载的图片是否缓存在内存中
                    .cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
                    .displayer(new RoundedBitmapDisplayer(20))// 设置成圆角图片
                    .build();// 创建DisplayImageOptions对象
            // 使用ImageLoader加载图片
            imageLoader.displayImage(picture_uri[position],
                    holder.iv_lin, options);

            return convertView;
        }

        /**
         * 控件缓存类
         * @author 邹奇
         *
         */
        class ViewHolder {
            ImageView iv_lin;
        }

    }

    @Override
    protected void onDestroy() {
        // 回收该页面缓存在内存中的图片
        imageLoader.clearMemoryCache();
        super.onDestroy();
    }

}

效果展示:

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值