**Android_开源框架_AndroidUniversalImageLoader网络图片加载**

Android_开源框架_AndroidUniversalImageLoader网络图片加载
1.功能概要
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示。

(1).使用多线程加载图片
(2).灵活配置ImageLoader的基本参数,包括线程数、缓存方式、图片显示选项等;
(3).图片异步加载缓存机制,包括内存缓存及SDCard缓存;
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。

2.简单实现
ImageLoader采用单例设计模式,ImageLoader imageLoader = ImageLoader.getInstance();得到该对象,每个ImageLoader采用单例设计模式,ImageLoader必须调用init()方法完成初始化。

//  1.完成ImageLoaderConfiguration的配置  
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)  
    .memoryCacheExtraOptions(480, 800)// default = device screen dimensions  
    .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)  
    .taskExecutor(...)  
    .taskExecutorForCachedImages(...)  
    .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  
    .discCache(new UnlimitedDiscCache(cacheDir))// default  
    .discCacheSize(50 * 1024 * 1024)        // 缓冲大小  
    .discCacheFileCount(100)                // 缓冲文件数目  
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default  
    .imageDownloader(new BaseImageDownloader(context)) // default  
    .imageDecoder(new BaseImageDecoder()) // default  
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default  
    .writeDebugLogs()  
    .build();  

//  2.单例ImageLoader类的初始化  
ImageLoader imageLoader = ImageLoader.getInstance();  
imageLoader.init(config);  

//  3.DisplayImageOptions实例对象的配置  
//      以下的设置再调用displayImage()有效,使用loadImage()无效  
DisplayImageOptions options = new DisplayImageOptions.Builder()  
    .showStubImage(R.drawable.ic_stub)          // image在加载过程中,显示的图片  
    .showImageForEmptyUri(R.drawable.ic_empty)  // empty URI时显示的图片  
    .showImageOnFail(R.drawable.ic_error)       // 不是图片文件 显示图片  
    .resetViewBeforeLoading(false)  // default  
    .delayBeforeLoading(1000)  
    .cacheInMemory(false)           // default 不缓存至内存  
    .cacheOnDisc(false)             // default 不缓存至手机SDCard  
    .preProcessor(...)  
    .postProcessor(...)  
    .extraForDownloader(...)  
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default  
    .bitmapConfig(Bitmap.Config.ARGB_8888)              // default  
    .decodingOptions(...)  
    .displayer(new SimpleBitmapDisplayer()) // default 可以设置动画,比如圆角或者渐变  
    .handler(new Handler())                             // default  
    .build();  

//  4图片加载  
//  4.1 调用displayImage  
imageLoader.displayImage(  
    uri,        /* 
                    String imageUri = "http://site.com/image.png";      // from Web 
                    String imageUri = "file:///mnt/sdcard/image.png";   // from SD card 
                    String imageUri = "content://media/external/audio/albumart/13"; // from content provider 
                    String imageUri = "assets://image.png";             // from assets 
                    */  
    imageView,      // 对应的imageView控件  
    options);       // 与之对应的image显示方式选项  

//  4.2 调用loadImage  
//      对于部分DisplayImageOptions对象的设置不起作用  
imageLoader.loadImage(  
        uri,   
        options,   
        new MyImageListener()); //ImageLoadingListener  
class MyImageListener extends SimpleImageLoadingListener{  

    @Override  
    public void onLoadingStarted(String imageUri, View view) {  
        imageView.setImageResource(R.drawable.loading);  
        super.onLoadingStarted(imageUri, view);  
    }  

    @Override  
    public void onLoadingFailed(String imageUri, View view,  
            FailReason failReason) {  
        imageView.setImageResource(R.drawable.no_pic);  
        super.onLoadingFailed(imageUri, view, failReason);  
    }  

    @Override  
    public void onLoadingComplete(String imageUri, View view,  
            Bitmap loadedImage) {  
        imageView.setImageBitmap(loadedImage);  
        super.onLoadingComplete(imageUri, view, loadedImage);  
    }  

    @Override  
    public void onLoadingCancelled(String imageUri, View view) {  
        imageView.setImageResource(R.drawable.cancel);  
        super.onLoadingCancelled(imageUri, view);  
    }  

}  

3.支持的Uri

String imageUri = "http://site.com/image.png";      // from Web  
String imageUri = "file:///mnt/sdcard/image.png";   // from SD card  
String imageUri = "content://media/external/audio/albumart/13"; // from content provider  
String imageUri = "assets://image.png";             // from assets  
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch) 

加载drawables下图片,可以通过ImageView.setImageResource(…) 而不是通过上面的ImageLoader.

4.缓冲至手机
默认不能保存缓存,必须通过下面的方式指定

DisplayImageOptions options = new DisplayImageOptions.Builder()  
        ...  
        .cacheInMemory(true)  
        .cacheOnDisc(true)  
        ...  
        .build();  
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())  
        ...  
        .defaultDisplayImageOptions(options)  
        ...  
        .build();  
ImageLoader.getInstance().init(config); // Do it on Application start  

ImageLoader.getInstance().displayImage(imageUrl, imageView);    /* 
                                            默认为defaultDisplayImageOptions设定的options对象,此处不用指定options对象 */

或者通过下面这种方式

DisplayImageOptions options = new DisplayImageOptions.Builder()  
        ...  
        .cacheInMemory(true)  
        .cacheOnDisc(true)  
        ...  
        .build();  
ImageLoader.getInstance().displayImage(imageUrl, imageView, options); //此处指定options对象  

由于缓存需要在外设中写入数据,故需要添加下面的权限

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

5.OutOfMemoryError
如果OutOfMemoryError错误很常见,可以通过下面的方式设置
(1).减少configuration中线程池的线程数目(.threadPoolSize(…)) 推荐为1 - 5
(2).display options通过.bitmapConfig(Bitmap.Config.RGB_565)设置. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
(3).使用configuration的memoryCache(new WeakMemoryCache())方法 或者不调用.cacheInMemory()方法
(4).display options通过.imageScaleType(ImageScaleType.IN_SAMPLE_INT) 或者 .imageScaleType(ImageScaleType.EXACTLY)方法
(4).避免使用RoundedBitmapDisplayer,它创建了一个新的ARGB_8888 Bitmap对象

6.内存缓存管理
通过imageLoaderConfiguration.memoryCache([new LruMemoryCache(1)]))对手机内存缓存进行管理

这里写图片描述
7.SDcard缓存管理
通过imageLoaderConfiguration.discCache([new TotalSizeLimitedDiscCache()]))对SD卡缓存进行管理

这里写图片描述
UnlimitedDiscCache is 30%-faster than other limited disc cache implementations.

本文转载来自http://www.cnblogs.com/wanqieddy/p/3836485.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值