ImageLoader的使用

ImageLoader可以实现:
1)可以实现多线程下载图片,图片可以来源于网络,文件和assets,drawable本地等。
2)可以随意的配置ImageLoader。例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示以及其它一些配置。
3)缓存方面:支持图片的内存缓存,文件缓存和SD卡的缓存。
4)支持图片下载过程的监听。
5)对Bitmap进行裁剪,避免Bitmap占用过多的内存。
6)可以控制图片的加载过程,如暂停图片加载,重新加载图片,一般在ListView,GridView,滑动的过程中暂停加载图片,停止的时候加载图片。
7)可以在较慢的网络下对图片进行加载。


使用前应该把ImageLoader的jar包配置到项目中:
1.创建一个MyApplication,继承Application,在onCreate中初始化ImageLoader。      全局配置

1)创建默认的ImageLoader配置参数

public void onCreate() {
            super.onCreate();
            //创建默认的ImageLoader参数
            ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
            ImageLoader.getInstance().init(configuration);
        }

2)也可以自定义ImageLoader配置参数

File cacheDir =getExternalCacheDir();//外部存储
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
                .memoryCacheExtraOptions(480, 800) // default = device screen dimensions
                .threadPoolSize(3) // default
                .threadPriority(Thread.NORM_PRIORITY - 1) // default 设置线程的优先级
                .tasksProcessingOrder(QueueProcessingType.FIFO) // default
                .denyCacheImageMultipleSizesInMemory()
                .memoryCache(new LruMemoryCache(2 * 1024 * 1024))//可以通过自己的内存缓存实现
                .memoryCacheSize(2 * 1024 * 1024)//内存缓存的最大值
                .memoryCacheSizePercentage(13) // default
                .diskCache(new UnlimitedDiskCache(cacheDir)) // default
                .diskCacheSize(50 * 1024 * 1024)//50 Mb sd卡(本地)缓存的最大值
                .diskCacheFileCount(100)//可以缓存的文件数量
                .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
                .imageDownloader(new BaseImageDownloader(this)) // default
                //默认的显示图片配置,可以理解为一般客户的口味(可以理解为上面厨房比喻)
                .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
                .writeDebugLogs()
                .build();
        ImageLoader.getInstance().init(config);


3.加载图片的方法
1)使用loadimage来加载图片

imageView = (ImageView) findViewById(R.id.imageView);
        ImageLoader.getInstance().loadImage(imageUrl, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String s, View view) {
                //开始下载
            }

            @Override
            public void onLoadingFailed(String s, View view, FailReason failReason) {
                //下载失败
            }

            @Override
            public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                //下载完成
                imageView.setImageBitmap(bitmap);//将下载的图片设置给ImageView即可
                Log.i("log","ok");
            }

            @Override
            public void onLoadingCancelled(String s, View view) {
                //取消下载
            }
        });


2)在时间开发中,我们不会使用上述的方法,可以设置时候使用缓存,是否使用文件缓存等

DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.mipmap.ic_launcher)//加载中的图片
                .showImageOnFail(R.mipmap.error)//加载错误时显示的图片
                .cacheInMemory(true)//设置内存缓存
                .cacheOnDisk(true)//设置硬盘缓存
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();
        //如果不需要监听,只需要设置前三个参数即可
        ImageLoader.getInstance().displayImage(imageUrl, imageView, options, new SimpleImageLoadingListener(), new ImageLoadingProgressListener() 		{
            @Override
            public void onProgressUpdate(String imageUri, View view, int current,
                                         int total) {

            }
        });


3)加载其它来源的图片

//图片来源于Content provider
String contentprividerUrl = "content://media/external/audio/albumart/13";

//图片来源于assets  
String assetsUrl = Scheme.ASSETS.wrap("image.png");

//图片来源于文件  
String drawableUrl = Scheme.DRAWABLE.wrap("R.drawable.image");


4)使用ListView,GridView加载图片
使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片,该类使用的是代理模式。

 listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
 gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));


第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载。
5)避免OOM
虽然这个框架有很好的缓存机制,有效的避免了OOM的产生,一般的情况下产生OOM的概率比较小,但是并不能保证OutOfMemoryError永远不发生,这个框架对于OutOfMemoryError做了简单的catch,保证我们的程序遇到OOM而不被crash掉,但是如果我们使用该框架经常发生OOM,我们应该怎么去改善呢?
减少线程池中线程的个数,在ImageLoaderConfiguration中的(.threadPoolSize)中配置,推荐配置1-5
在DisplayImageOptions选项中配置bitmapConfig为Bitmap.Config.RGB_565,因为默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
在ImageLoaderConfiguration中配置图片的内存缓存为memoryCache(new WeakMemoryCache()) 或者不使用内存缓存
在DisplayImageOptions选项中设置.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者imageScaleType(ImageScaleType.EXACTLY)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值