• [转]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. //  1.完成ImageLoaderConfiguration的配置  
    2. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)  
    3.     .memoryCacheExtraOptions(480, 800)          // default = device screen dimensions  
    4.     .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)  
    5.     .taskExecutor(...)  
    6.     .taskExecutorForCachedImages(...)  
    7.     .threadPoolSize(3)                          // default  
    8.     .threadPriority(Thread.NORM_PRIORITY - 1)   // default  
    9.     .tasksProcessingOrder(QueueProcessingType.FIFO) // default  
    10.     .denyCacheImageMultipleSizesInMemory()  
    11.     .memoryCache(new LruMemoryCache(2 * 1024 * 1024))  
    12.     .memoryCacheSize(2 * 1024 * 1024)  
    13.     .memoryCacheSizePercentage(13)              // default  
    14.     .discCache(new UnlimitedDiscCache(cacheDir))// default  
    15.     .discCacheSize(50 * 1024 * 1024)        // 缓冲大小  
    16.     .discCacheFileCount(100)                // 缓冲文件数目  
    17.     .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default  
    18.     .imageDownloader(new BaseImageDownloader(context)) // default  
    19.     .imageDecoder(new BaseImageDecoder()) // default  
    20.     .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default  
    21.     .writeDebugLogs()  
    22.     .build();  
    23.   
    24. //  2.单例ImageLoader类的初始化  
    25. ImageLoader imageLoader = ImageLoader.getInstance();  
    26. imageLoader.init(config);  
    27.   
    28. //  3.DisplayImageOptions实例对象的配置  
    29. //      以下的设置再调用displayImage()有效,使用loadImage()无效  
    30. DisplayImageOptions options = new DisplayImageOptions.Builder()  
    31.     .showStubImage(R.drawable.ic_stub)          // image在加载过程中,显示的图片  
    32.     .showImageForEmptyUri(R.drawable.ic_empty)  // empty URI时显示的图片  
    33.     .showImageOnFail(R.drawable.ic_error)       // 不是图片文件 显示图片  
    34.     .resetViewBeforeLoading(false)  // default  
    35.     .delayBeforeLoading(1000)  
    36.     .cacheInMemory(false)           // default 不缓存至内存  
    37.     .cacheOnDisc(false)             // default 不缓存至手机SDCard  
    38.     .preProcessor(...)  
    39.     .postProcessor(...)  
    40.     .extraForDownloader(...)  
    41.     .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// default  
    42.     .bitmapConfig(Bitmap.Config.ARGB_8888)              // default  
    43.     .decodingOptions(...)  
    44.     .displayer(new SimpleBitmapDisplayer()) // default 可以设置动画,比如圆角或者渐变  
    45.     .handler(new Handler())                             // default  
    46.     .build();  
    47.       
    48. //  4图片加载  
    49. //  4.1 调用displayImage  
    50. imageLoader.displayImage(  
    51.     uri,        /* 
    52.                     String imageUri = "http://site.com/image.png";      // from Web 
    53.                     String imageUri = "file:///mnt/sdcard/image.png";   // from SD card 
    54.                     String imageUri = "content://media/external/audio/albumart/13"; // from content provider 
    55.                     String imageUri = "assets://image.png";             // from assets 
    56.                     */  
    57.     imageView,      // 对应的imageView控件  
    58.     options);       // 与之对应的image显示方式选项  
    59.   
    60. //  4.2 调用loadImage  
    61. //      对于部分DisplayImageOptions对象的设置不起作用  
    62. imageLoader.loadImage(  
    63.         uri,   
    64.         options,   
    65.         new MyImageListener()); //ImageLoadingListener  
    66. class MyImageListener extends SimpleImageLoadingListener{  
    67.   
    68.     @Override  
    69.     public void onLoadingStarted(String imageUri, View view) {  
    70.         imageView.setImageResource(R.drawable.loading);  
    71.         super.onLoadingStarted(imageUri, view);  
    72.     }  
    73.   
    74.     @Override  
    75.     public void onLoadingFailed(String imageUri, View view,  
    76.             FailReason failReason) {  
    77.         imageView.setImageResource(R.drawable.no_pic);  
    78.         super.onLoadingFailed(imageUri, view, failReason);  
    79.     }  
    80.   
    81.     @Override  
    82.     public void onLoadingComplete(String imageUri, View view,  
    83.             Bitmap loadedImage) {  
    84.         imageView.setImageBitmap(loadedImage);  
    85.         super.onLoadingComplete(imageUri, view, loadedImage);  
    86.     }  
    87.   
    88.     @Override  
    89.     public void onLoadingCancelled(String imageUri, View view) {  
    90.         imageView.setImageResource(R.drawable.cancel);  
    91.         super.onLoadingCancelled(imageUri, view);  
    92.     }  
    93.       
    94. }  

    3.支持的Uri

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

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

    4.缓冲至手机

    默认不能保存缓存,必须通过下面的方式指定

    1. DisplayImageOptions options = new DisplayImageOptions.Builder()  
    2.         ...  
    3.         .cacheInMemory(true)  
    4.         .cacheOnDisc(true)  
    5.         ...  
    6.         .build();  
    7. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())  
    8.         ...  
    9.         .defaultDisplayImageOptions(options)  
    10.         ...  
    11.         .build();  
    12. ImageLoader.getInstance().init(config); // Do it on Application start  
    13.   
    14. ImageLoader.getInstance().displayImage(imageUrl, imageView);    /* 
    15.                                             默认为defaultDisplayImageOptions设定的options对象,此处不用指定options对象 */  

    或者通过下面这种方式

    1. DisplayImageOptions options = new DisplayImageOptions.Builder()  
    2.         ...  
    3.         .cacheInMemory(true)  
    4.         .cacheOnDisc(true)  
    5.         ...  
    6.         .build();  
    7. ImageLoader.getInstance().displayImage(imageUrl, imageView, options); //此处指定options对象  

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

    1. <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)]))对手机内存缓存进行管理

    LruMemoryCache

    API >= 9默认.it is moved to the head of a queue.

    FreqLimitedMemoryCache

    当超过缓存大小后,删除最近频繁使用的bitmap

    LRULimitedMemoryCache

    API < 9 默认.当超过缓存大小后,删除最近使用的bitmap

    FIFOLimitedMemoryCache

    FIFO rule is used for deletion when cache size limit is exceeded

    LargestLimitedMemoryCache

    The largest bitmap is deleted when cache size limit is exceeded

    WeakMemoryCache

    Unlimited cache

    7.SDcard缓存管理

    通过imageLoaderConfiguration.discCache([new TotalSizeLimitedDiscCache()]))对SD卡缓存进行管理

    UnlimitedDiscCache

    default The fastest cache, doesn't limit cache size

    TotalSizeLimitedDiscCache

    Cache limited by total cache size. If cache size exceeds specified limit then file with themost oldest lastusage date will be deleted

    FileCountLimitedDiscCache

    Cache limited by file count. If file count in cache directory exceeds specified limit then file with the most oldest last usage date will be deleted.

    LimitedAgeDiscCache

    Size-unlimited cache with limited files' lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.

    UnlimitedDiscCache is 30%-faster than other limited disc cache implementations.

  • 相关阅读:
    mysql常见的优化方法
    Mac 怎么通过自带终端连接linux服务器
    基于 appium 的 UI 自动化测试
    sourcetree在mac上的使用
    mac下git安装和使用
    mac 上更改环境变量
    Mac环境下svn的使用
    jira常用配置
    influxDB基本操作
    Collectd 和 InfluxDB 的部署和使用
  • 原文地址:https://www.cnblogs.com/jackson-leung/p/4135829.html
Copyright © 2020-2023  润新知