【Android】基于ImageLoader的工具类写法

传送门:https://github.com/nostra13/Android-Universal-Image-Loader
我也不知道为啥突然想写这么一篇文章!ImageLoader可以帮助我们解决各种加载图片错乱,OOM等问题,我表示非常喜欢,而且配置也不难,在GitHub上面的参考文档也写得灰常详细!
我们先来看看ImageLoader有什么特点
1.支持同步/异步多线程加载图片,支持多种Uri图片加载
<pre>"http://site.com/image.png" // from Web
"file:///mnt/sdcard/image.png" // from SD card
"file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail)
"content://media/external/images/media/13" // from content provider
"content://media/external/video/media/13" // from content provider (video thumbnail)
"assets://image.png" // from assets
"drawable://" + R.drawable.img // from drawables (non-9patch images)
</pre>

ImageLoader缓存机制

2.支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
<pre>
下面是一些参数的解释:
final Resources resources;
final int maxImageWidthForMemoryCache; 内存缓存图片的最大宽度
final int maxImageHeightForMemoryCache; 内存缓存图片的最大高度
final int maxImageWidthForDiskCache; 磁盘缓存图片的宽度
final int maxImageHeightForDiskCache; 磁盘缓存图片的高度
final BitmapProcessor processorForDiskCache; 磁盘缓存图片处理器
final Executor taskExecutor;
final Executor taskExecutorForCachedImages; 缓存任务线程池
final boolean customExecutor;
final boolean customExecutorForCachedImages; 自定义缓存线程池
final int threadPoolSize; 池里核心线程数
final int threadPriority; 线程优先级
final QueueProcessingType tasksProcessingType; 任务队列的类型:enum{LIFO、FIFO}
final MemoryCache memoryCache; 内存缓存
final DiskCache diskCache; 磁盘缓存
final ImageDownloader downloader; 图片下载器
final ImageDecoder decoder; 图片解析器
final DisplayImageOptions defaultDisplayImageOptions; 图片显示参数
final ImageDownloader networkDeniedDownloader; 图片下载器:禁止从网络加载
final ImageDownloader slowNetworkDownloader; 图片下载器:慢速网络加载
</pre>
<pre>
1.imageScaleType(ImageScaleType imageScaleType) //设置图片的缩放方式
缩放类型mageScaleType:
EXACTLY :图像将完全按比例缩小的目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2.displayer(BitmapDisplayer displayer) //设置图片的显示方式
显示方式displayer:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片 </pre>

  1. 支持图片的内存缓存,文件系统缓存或者SD卡缓存,支持图片下载过程的监听
    <pre>
    .memoryCache(new LruMemoryCache(2 * 1024 * 1024))
    .memoryCacheSize(2 * 1024 * 1024)
    .memoryCacheSizePercentage(13) // default
    .diskCache(new UnlimitedDiskCache(cacheDir)) // default
    .diskCacheSize(50 * 1024 * 1024)
    .diskCacheFileCount(100)
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
    </pre>
    4.准确的内存控制,减少OOM的可能
    有兴趣可以看看这篇文章:http://blog.csdn.net/crl7885/article/details/43877261

    ImageLoader内存

    5.较好的控制图片的加载过程

  2. 配置ImageLoader
    1.1 在项目内新建一个MyApp类继承于Application,然后在Manifest里面声明的android:name=“MyApp”
    1.2 之后在MyApp的onCreate方法内,配置ImageLoader!ImageLoader加载图片使用了单例模式,所以可以在任何地方进行配置
    <pre>/** Returns singleton class instance */
    public static ImageLoader getInstance() {
    if (instance == null) {
    synchronized (ImageLoader.class) {
    if (instance == null) {
    instance = new ImageLoader();
    }
    }
    }
    return instance;
    }
    </pre>
    经过我们上面的描述,我们可以写出根据ImageLoader的默认配置方法配置出一下代码
    <pre>
    try {
    int w = Utils.getScreenWidth();//获取屏幕宽度
    int h = Utils.getScreenHeight();//获取屏幕高度
    fileNameGenerator = new FileNameGenerator() {
    @Override
    public String generate(String imageUri) {
    return MD5Util.MD5_32(imageUri);//缓存图片命名规范
    }
    };
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(app)
    .memoryCacheExtraOptions(w, h)
    .diskCacheExtraOptions(w, h, null)
    .threadPoolSize(8)//线程池线程数量
    .threadPriority(Thread.NORM_PRIORITY - 2) //线程优先级
    .tasksProcessingOrder(QueueProcessingType.FIFO)//任务队列的类型
    .denyCacheImageMultipleSizesInMemory()
    // .memoryCache(new LruMemoryCache(3 * 1024 * 1024))
    .memoryCacheSize(1 * 1024 * 1024)
    .memoryCacheSizePercentage(30)
    // .diskCache(new LruDiscCache(StorageUtils.getCacheDirectory(app), fileNameGenerator, 10 * 1024 * 1024))//图片缓存名称MD5,缓存大小10M
    .diskCache(new UnlimitedDiscCache(StorageUtils.getCacheDirectory(app)))
    // .diskCacheSize(10 * 1024 * 1024)
    // .diskCacheFileCount(300)
    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
    .imageDownloader(new BaseImageDownloader(app))
    .imageDecoder(new BaseImageDecoder(true))
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
    .build();

         ImageLoader.getInstance().init(config);
     } catch (Exception e) {
         Timber.e(e, "");
     }
    

    }
    </pre>

  3. 写ImageLoader工具类加载图片
    我们知道ImageLoader可以加载多种uri图片,那么我们可以考虑写一个工具类来适配各种的uri
    首先创建两个默认的配置,之后的各种改变都可以从这里衍生出来
    <pre>
    private static final ImageLoader LOADER = ImageLoader.getInstance();
    public static final DisplayImageOptions SIMPLE_OPTIONS = DisplayImageOptions.createSimple();//创建public static final DisplayImageOptions DEFAULT_OPTIONS = createImageOptions();
    private static DisplayImageOptions createImageOptions() {
    return new DisplayImageOptions.Builder()
    .cloneFrom(SIMPLE_OPTIONS)
    .bitmapConfig(Bitmap.Config.RGB_565)
    .cacheInMemory(true)
    .cacheOnDisk(true)
    .delayBeforeLoading(200)
    .build();}
    </pre>

<pre>
//加载图片
public static void loader(String url, ImageView imageView) {
loader(url, imageView, DEFAULT_OPTIONS);
}

/*
 * 加载资源文件
 * @param uri 资源文件的Uri,通过解析后得到String字符串
 * file,content都可以转成Uri
 * @param imageView
 */
public static void loader(Uri uri, ImageView imageView) {
    loader(Uri.decode(uri.toString()), imageView);
}

public static void loader(int resId, ImageView imageView) {
    loader("drawable://" + resId, imageView);
}

/*
* 圆角图片
* 也可以写自定义的BitmapDisplayer
* @return
*/
public static DisplayImageOptions creatRoundAvatarImageOptions(int size){
return new DisplayImageOptions.Builder()
.cloneFrom(DEFAULT_OPTIONS)
.displayer(new RoundedBitmapDisplayer(size))
.build();
}
</pre>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,062评论 25 707
  • 太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源...
    庞哈哈哈12138阅读 20,100评论 3 283
  • 体验入 一晚上3个小时的全员生发课程回流会,所有家人回流了学习的感受,其中的触动点,在生活和工作中又得到了哪些启发...
    Una笑笑阅读 216评论 0 2
  • 所有失去的 都会以另一种方式归来 如果事与愿违就相信一定另有安排 时光没有归程 愿你找回遗失的自己 并不是所有的故...
    Miss微微恩阅读 433评论 0 0
  • 你有没有试过一件很小的事,当时并不知道它意味着什么,却让你记忆了很久? 初中的时候,语文老师布置了一篇作文,题目我...
    远方的河阅读 579评论 0 1