android 图片框架之ImageLoader

作者: 静染星辰 | 来源:发表于2019-06-05 10:52 被阅读15次
    • ImageLoader的工作原理是这样的:在显示图片的时候,它会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。
      基于这个原理,我们可以在每一次退出一个页面的时候,把ImageLoader内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。
      尽管ImageLoader很强大,但一直把图片缓存在内存中,会导致内存占用过高。虽然对图片的引用是软引用,软引用在内存不够的时候会被GC,但我们还是希望减少GC的次数,所以要经常手动清理ImageLoader中的缓存。
      我们在上面MainActivity的 onDestroy()生命周期方法中,执行了ImageLoader的clearMemoryCache方法,以确保页面销毁时,把为了显示这个页面而增加的内存缓存清除。这样,即使到了下个页面要复用之前加载过的图片,虽然内存中没有了,根据ImageLoader的缓存策略,还是可以在本地磁盘上找到:
    @Override
        protected void onDestroy() {
            // 回收该页面缓存在内存中的图片
            imageLoader.clearMemoryCache();
            super.onDestroy();
        }
    

    ··此外,由于ImageLoader对图片是软引用的形式,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收)。

    1,导入项目:

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

    2,初始化框架:

    重写application的oncreate方法

     DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .cacheInMemory(false) //设置下载的图片是否缓存在内存中
                    .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
                    .showImageOnLoading(R.drawable.zhanwei_shape)
                    .showImageOnFail(R.drawable.zhanwei_shape)
                    .bitmapConfig(Bitmap.Config.RGB_565)
                    .considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转)
                    .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位
                    .build();
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(myApplation)
                    .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(Constants.FILEPATH)))//自定义缓存路径
                    .imageDownloader(new BaseImageDownloader(myApplation, 5 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间
                    .writeDebugLogs() // Remove for release app
                    .build();
    ImageLoader.getInstance().init(config);//全局初始化此配置
    

    3,使用:

    DisplayImageOptions options = new DisplayImageOptions.Builder()
                .cacheInMemory(true) //设置下载的图片是否缓存在内存中
                .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
                .showImageOnLoading(R.drawable.zhanwei_avater)
                .showImageOnFail(R.drawable.zhanwei_avater)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .considerExifParams(false)//是否考虑JPEG图像EXIF参数(旋转,翻转)
                .resetViewBeforeLoading(false)// 设置图片在下载前是否重置,复位
                .build();
    ImageLoader.getInstance().displayImage(imageUri , imageview, options);
    
    imageUri 的几种图片来源:
    // 网络图片
    String imageUri = "http://pic2.16pic.com/00/15/80/16pic_1580359_b.jpg";   
    //SD卡图片
    String imageUri = "file:///mnt/sdcard/zhanwei.png"; 
    // 媒体文件夹 
    String imageUri = "content://media/external/audio/albumart/6";  
    // assets 
    String imageUri = "assets://zhanwei.png";
    //  drawable文件 
    String imageUri = "drawable://" + R.drawable.zhanwei;  
    

    --------END------

    我是静染星辰,私人微信:azxy986753

    欢迎添加微信,互相学习,互相进步!

    相关文章

      网友评论

        本文标题:android 图片框架之ImageLoader

        本文链接:https://www.haomeiwen.com/subject/ahzlxctx.html