前言:从学习Android已经有十周时间了,之前都在学习PHP脚本语言,曾经还用纯php写了一个小型论坛,虽然不难,即使你用的东西自己同样封装了,但是最终总是感觉不太舒服,后来就用了国内的ThinkPHP框架作为框架学习,然而就慢慢体验到了使用框架的好处,比如优化的程序较好,更容易学习到框架里面不错的知识模块……其实Android也是一样的,倘若你开发一个项目的话,一切都从零开始,嘿嘿,那你就可悲╮╭,对于开源的东西,学会选择轮子以及会用轮子对于开发项目是非常重要的,接下来介绍的轮子就是Android-Universal-Image-Loader图片加载框架。

将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西。最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就顺便整理记录下来,作为这一个多月来博客的重新开火做饭吧。从今天起我会陆续恢复博客的更新,也希望大家继续支持。

原文:http://www.jianshu.com/p/3ac30878c72c

Facebook应该没人没听过吧?嗯,今天学的这个Fresco就来源于它。Fresco相比Picasso和Glide来说就来得重量级一点了,当然功能也会更加强大,废话少说,开撸

最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录。

****Android-Universal-Image-Loader简介****Android-Universal-Image-Loader是当前非常流行的一款开源图片加载框架。

今天要介绍的是Github上一个使用非常广泛的图片异步加载库Android-Universal-Image-Loader,该项目的功能十分强大,可以说是我见过的目前功能最全、性能最优的图片异步加载解决方案。做Android的同学都知道,Android加载大量图片时,由于系统分配给图片加载的内存大小有限,所以,如果加载图片量非常大的话容易报OOM异常,关于这个异常已经有不少解决方案了,我就不赘述。下面就简要介绍下这个开源项目的主要功能和使用:

一、UniversalImageLoader

https://github.com/nostra13/Android-Universal-Image-Loader
UIL可以算是老牌最火的图片加载库了,使用过这个框架的项目可以说多到教你做人。可惜的是该作者在项目中说明已经停止了对该项目的维护。这就意味着以后任何的新特性都不会再继续开发,所以毫无疑问
UIL不推荐在项目中使用了。

加载原理:
1、ImageLoader图片加载器,采取了单例模式,用于图片的加载和显示
2、MemoryCache图片内存换成,默认使用算法Least Recently Used(LRU),存储结构LinkedHashMap
3、DiskCache图片磁盘缓存,默认使用算法LruDiskCache,缓存目录下名为journal文件记录缓存所有操作
4、图片加载流程
    1.判断图片的内存缓存是否存在,若存在直接执行步骤8
    2.判断图片的磁盘缓存是否存在,若存在直接执行步骤5
    3.ImageDownloader从网络上下载
    4.将图片缓存在磁盘上
    5.ImageDecoder将图片decode成bitmap对象
    6.BitmapProcessor根据DisplayImageOptions配置对图片进行预处理(Pre-process Bitmap);
    7.将bitma对象缓存到内存中
    8.根据DisplayImageOptions配置对图片进行后处理(Post-process Bitmap)
    9.执行DisplayBitmapTask将图片显示在相应的控件上

特性

强大的内存管理

大家都知道Bitmap占用内存过大经常是导致程序OOM的元凶,同时也会引起系统频繁的GC,在5.0系统一下会显著引发界面卡顿。Fresco在5.0以下系统里使用了一块特别的区域来存放图片,减少OOM以及使App更加流畅

可定制的图片加载方式

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
  • 先显示一个低清晰度的图片,等高清图下载完之后再显示高清图
    加载完成回调通知
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
    缩放或者旋转图片
  • 对已下载的图片再次处理
  • 支持WebP解码,即使在早先对WebP支持不完善的Android系统上也能正常使用!

图片绘制

  • 自定义居中焦点
  • 圆角图,当然圆圈也行
  • 下载失败之后,点击重现下载
  • 自定义占位图,自定义overlay, 或者进度条
  • 指定用户按压时的overlay

加载渐进式图片

渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
  Android 本身的图片库不支持此格式,但是Fresco支持。

加载动图

加载Gif图和WebP动图在任何一个Android开发者眼里看来都是一件非常头疼的事情。每一帧都是一张很大的Bitmap,每一个动画都有很多帧。Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。

现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧。

****Android-Universal-Image-Loader优点****

 

二、Picasso

https://github.com/square/picasso
Picasso是Square公司开源的一个Android平台上的图片加载框架,简单易用,一句话完成加载图片

使用:Picasso.with(this).load("url").placeholder(R.mipmap.ic_default).into(imageView);
图片加载流程
    1.初始化Picasso,实例化其唯一的对象
    2.根据传入的Url、File、resource Id,构建ReqeustCreator对象
    3.根据ReqeustCreator构建Request对象,同时根据Reqeust属性,尝试从Cache中访问数据
    4.Cache Hit,则通过回调,设置Target或者ImageView,完成该Reqeust
    5.如果Cache Miss,那么则构建相应的Action,并提交到DispatcherThread当中
    6.Dispatcher中的Handler接收到相应的Message,调用dispatcher.performSubmit(action)进行处理
    7.创建BitmapHunter对象,并提交到PicassoExecutorService线程池
    8.再次检查Memory Cache中已经有缓存,如果Hit,则读取缓存中的Bitmap
    9.如果Cache miss,则交给Action对应的ReqeustHandler进行处理,比如网络请求,或者从File读取图片
    10.返回结果之后,通知Dispatcher中的Handler处理结果
    11.DispatcherThread中将BitmapHunter的结果打包(batch),最快200ms打包一次。通知主线程HANDLER进行处理
    12.主线程HANDLER接收打包的BitmapHunter,对最后的结果进行分发

项目地址

https://github.com/facebook/fresco

一、Picasso

  • 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
  • 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
  • 支持图片的内存缓存,文件系统缓存或者SD卡缓存
  • 支持图片下载过程的监听
  • 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
  • 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
  • 提供在较慢的网络下对图片进行加载

一、功能概要

三、Glide

https://github.com/bumptech/glide
Glide是Google一位员工的大作,
完全是基于Picasso,沿袭了Picasso的简洁风格,但是在此做了大量优化与改进

1.内存缓存
Picasso默认Bitmap是ARGB8888格式(一个像素占用4个字节内存), 
Glide默认是RGB565格式(一个像素占用2个字节内存,但是没有透明度A), 内存开销小一半    
2.磁盘缓存
Picasso只会缓存原始尺寸图片,而Glide缓存多种规格,
Glide根据ImageView大小来缓存相应大小图片尺寸,
如ImageView大小是200*200,原图是400*400,Glide会缓存200*200规格图,而Picasso只会缓存400*400规格    
3.Glide支持加载Gif动态图,而Picasso不支持   
总体来说, Glide是在Picasso之上的二次开发,各个方面做了不少改进,
不过这也导致jar包比Picasso大不少,不过也就不到500k,影响不是很大。

使用方法

http://fresco-cn.org/docs/index.html

Gradle依赖:

compile 'com.facebook.fresco:fresco:0.13.0'

初始化Fresco:

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

Fresco使用前必须进行初始化,因为多次调用初始化毫无意义,所以在Application里面做这件事再适合不过了。然后在AndroidManifest.xml指定Application
类,并确保已加入了网络权限。

  <manifest
    ...
    >
    <uses-permission android:name="android.permission.INTERNET" />
    <application
      ...
      android:label="@string/app_name"
      android:name=".MyApplication"
      >
      ...
    </application>
    ...
  </manifest>

类MVC的三大组件:

  • V:DraweeView
  • M:DraweeHierachy
  • C:DraweeController

Fresco不像别的很多框架只是用来下载和缓存图片显示由ImageView负责,它有自己的一套显示图片的控件,即DraweeView:

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/draweeView"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true" />

DraweeView有丰富的可配置参数:

fresco:actualImageScaleType="focusCrop"

fresco:placeholderImage="@drawable/icon_placeholder"
fresco:placeholderImageScaleType="fitCenter"

fresco:progressBarImage="@drawable/icon_progress_bar"
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="5000"

fresco:failureImage="@drawable/icon_failure"
fresco:failureImageScaleType="centerInside"

fresco:retryImage="@drawable/icon_retry"
fresco:retryImageScaleType="centerCrop"

fresco:fadeDuration="5000"

fresco:roundedCornerRadius="30dp"
fresco:roundTopLeft="true"
fresco:roundTopRight="true"
fresco:roundBottomLeft="true"
fresco:roundBottomRight="true"
fresco:roundingBorderWidth="10dp"
fresco:roundingBorderColor="@android:color/black"
fresco:roundWithOverlayColor="@android:color/darker_gray"
fresco:roundAsCircle="true"

fresco:backgroundImage="@android:color/holo_orange_light"

fresco:pressedStateOverlayImage="@android:color/holo_green_dark"

fresco:overlayImage="@android:color/black"

DraweeView可以配置placeholder、进度条、圆角等等。
如果仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,那么简单使用
SimpleDraweeView即可。

Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);

DraweeHierarchy用来配置DraweeView的参数,类似于xml中配置的参数:

GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
        .setPlaceholderImage(ContextCompat.getDrawable(this, R.drawable.icon_placeholder), ScalingUtils.ScaleType.CENTER_CROP)
        .setProgressBarImage(ContextCompat.getDrawable(this, R.drawable.icon_progress_bar), ScalingUtils.ScaleType.CENTER_INSIDE)
        .build();

再来段设置圆角的:

RoundingParams roundingParams = new RoundingParams();

roundingParams.setCornersRadii(new float[]{55, 25, 30, 35, 40, 45, 50, 55})
        .setRoundAsCircle(true)
        .setBorder(Color.RED, 10)
        .setOverlayColor(Color.BLUE)
        .setRoundingMethod(RoundingParams.RoundingMethod.BITMAP_ONLY);
//      .setRoundingMethod(RoundingParams.RoundingMethod.OVERLAY_COLOR);

GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources())
//      .setRoundingParams(RoundingParams.asCircle())
//      .setRoundingParams(RoundingParams.fromCornersRadius(200))
//      .setRoundingParams(RoundingParams.fromCornersRadii(200, 0, 200, 200))
//      .setRoundingParams(RoundingParams.fromCornersRadii(new float[]{55, 25, 30, 35, 40, 45, 50, 55}))
        .setRoundingParams(roundingParams)
        .setFadeDuration(5000)
        .build();

DraweeController用来控制DraweeView的行为,如Uri地址、是否开启点击重试等:

DraweeController controller = Fresco.newDraweeControllerBuilder()
        .setUri(uri)
        .setTapToRetryEnabled(true)
        .setOldController(simpleDraweeView.getController())
        .build();

最后是给DraweeView设置DraweeHierarchy和DraweeController:

simpleDraweeView.setHierarchy(hierarchy);
simpleDraweeView.setController(controller);

参考链接:
Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用]

   1,首先在项目中引入picasso(以gradle为例),也就是app的build.gradle

****Android-Universal-Image-Loader使用****为了避免配置使用重复的代码,自己编写了点小封装Step-One:配置ImageLoaderConfiguration

 

四、Fresco

https://github.com/facebook/fresco
Fresco是Facebook出品,新一代图片加载库

Android应用可用内存有限,经常会因为图片加载导致OOM,虽然我们有各种手段去优化,尽量减少出现OOM的可能性,但是永远没法避免,尤其某些低端手机OOM更是严重。
Facebook另辟蹊径,既然没法在Java层处理,在更底层的Native堆做手脚,于是Fresco将图片放到一个特别的内存区域叫Ashmem区,就是属于Native堆,图片不再占用Java层内存,所以能大大的减少OOM

四个库对比,加载大图Fresco较好,不过Fresco比较庞大,推荐在主要都是图片的app中使用,一般app使用Glide和Picasso

    

package com.samego.alic.androidutils.common;/** * Created by alic on 16-5-17. */public class SameGoApplication extends Application { @Override public void onCreate() { super.onCreate(); initImageLoaderConfiguration(getApplicationContext; } /** * 初始化ImageLoaderConfiguration配置 * * @param context 上下文 */ public void initImageLoaderConfiguration(Context context) { //缓存文件目录 File cacheDir = StorageUtils.getCacheDirectory; //构建配置 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder //默认屏幕的大小 .memoryCacheExtraOptions // 内存缓存的设置选项 (最大图片宽度,最大图片高度) 默认当前屏幕分辨率 .diskCacheExtraOptions(480, 800, null) // 设置自定义加载和显示图片的线程池 .taskExecutor(DefaultConfigurationFactory.createExecutor(3, Thread.NORM_PRIORITY, QueueProcessingType.LIFO)) // 设置自定义加载和显示内存缓存或者硬盘缓存图片的线程池 .taskExecutorForCachedImages(DefaultConfigurationFactory.createExecutor(3, Thread.NORM_PRIORITY, QueueProcessingType.LIFO)) // 设置显示图片线程池大小,默认为3 // 注:如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效 .threadPoolSize // 设置图片加载线程的优先级,默认为Thread.NORM_PRIORITY-1 // 注:如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效 .threadPriority(Thread.NORM_PRIORITY - 2) // default // 设置图片加载和显示队列处理的类型 默认为QueueProcessingType.FIFO // 注:如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效 .tasksProcessingOrder(QueueProcessingType.FIFO) // default // 设置拒绝缓存在内存中一个图片多个大小 默认为允许,根据不同大小的imageView保存不同大小图片 .denyCacheImageMultipleSizesInMemory() // 设置内存缓存 默认为一个当前应用可用内存的1/8大小的LruMemoryCache .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) // 设置内存缓存的最大大小 默认为一个当前应用可用内存的1/8 .memoryCacheSize(2 * 1024 * 1024) // 设置内存缓存最大大小占当前应用可用内存的百分比 默认为一个当前应用可用内存的1/8 .memoryCacheSizePercentage // default // 设置硬盘缓存 .diskCache(new UnlimitedDiskCache) //缓存路径 // 设置硬盘缓存的最大大小 .diskCacheSize(50 * 1024 * 1024) // 设置硬盘缓存的文件的最多个数 .diskCacheFileCount // 设置硬盘缓存文件名生成规范 .diskCacheFileNameGenerator(new HashCodeFileNameGenerator // default // 设置图片下载器 .imageDownloader(new BaseImageDownloader // default // 设置图片解码器 .imageDecoder(DefaultConfigurationFactory.createImageDecoder // 设置默认的图片显示选项 .defaultDisplayImageOptions(DisplayImageOptions.createSimple // 打印DebugLogs .writeDebugLogs() //万事俱备 执行构造 .build(); //初始化配置文件 ImageLoader.getInstance().init; }}
  • 多线程图片加载;
  • 灵活更改ImageLoader的基本配置,包括最大线程数、缓存方式、图片显示选项等;
  • 图片异步加载缓存机制,包括内存缓存(软引用)及本地缓存;
  • 对加载过程实现监听和事件处理;
  • 能够配置加载图片的显示选项,包括图片圆角处理和加载完成显示动画等;
 compile 'com.squareup.picasso:picasso:2.5.2'

Step-Two:配置DisplayImageOptions

二、基本使用

   2,加载图片,通过源码可以发现load方法主要要以下几种重载

package com.samego.alic.androidutils.common;/** * 应用辅助配置文件 * Created by alic on 16-5-17. */public class AppConfig { public static DisplayImageOptions imageOptions() { /** * DisplayImageOptions所有配置简介 */ DisplayImageOptions options = new DisplayImageOptions.Builder() // 设置图片加载时的默认图片 .showImageOnLoading(R.drawable.login_face) // 设置图片加载失败的默认图片 .showImageOnFail(R.drawable.login_face) // 设置图片URI为空时默认图片 .showImageForEmptyUri(R.drawable.login_face) // 设置是否将View在加载前复位 .resetViewBeforeLoading // 设置延迟部分时间才开始加载 // 默认为0 .delayBeforeLoading // 设置添加到内存缓存 // 默认为false .cacheInMemory // 设置规模类型的解码图像 // 默认为ImageScaleType.IN_SAMPLE_POWER_OF_2 .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // 设置位图图像解码配置 // 默认为Bitmap.Config.ARGB_8888 .bitmapConfig(Bitmap.Config.ARGB_8888) // 设置选项的图像解码 .decodingOptions(new BitmapFactory.Options // 设置自定义显示器 // 默认为DefaultConfigurationFactory.createBitmapDisplayer() .displayer(new FadeInBitmapDisplayer // 设置自定义的handler // 默认为new Handler() .handler(new Handler // 建立 .build(); return options; }}
  1. 下载jar包universal-image-loader-1.8.5-with-sources.jar并导入工程(这应该不用教了吧)
  2. 配置Manifest文件,添加网络请求和访问外部存储的权限,因为要进行网络请求和本地缓存

    load(Uri uri)  

Step-Three:然后可以使用啦

[html] view
plaincopy

    load(String path)

package com.samego.alic.androidutils.view;public class MainActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initVIew(); } public void initVIew() { imageView = (ImageView) findViewById(R.id.imageVIew); //看这里使用,很简单的一行代码 ImageLoader.getInstance().displayImage("http://home.sise.cn/img/LOGO.png",imageView, AppConfig.imageOptions; }}

 

    load(File file)

配置后具体使用的其它方法Acceptable URIs examples

  1. <uses-permission android:name=”android.permission.INTERNET” />  
  2.     <!– Include next permission if you want to allow UIL to cache images on SD card –>  
  3.     <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />  

    load(int resourceId)

"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)SimpleImageLoader imageLoader = ImageLoader.getInstance();imageLoader.displayImage(imageUri, imageView);//支持回调方法imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { //你要干嘛哇 }});// 异步加载得到BitmapBitmap bmp = imageLoader.loadImageSync;// 加载图片更是可以支持监听imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { //你要干嘛哇 } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { //你要干嘛哇 } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { //你要干嘛哇 } @Override public void onLoadingCancelled(String imageUri, View view) { //你要干嘛哇 }}, new ImageLoadingProgressListener() { @Override public void onProgressUpdate(String imageUri, View view, int current, int total) { //你要干嘛哇 更新UI进度条罗 }});// Load image, decode it to Bitmap and return Bitmap to callback看看简单的官方英文ImageSize targetSize = new ImageSize; // result Bitmap will be fit to this sizeimageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() { @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { // Do whatever you want with Bitmap }});// Load image, decode it to Bitmap and return Bitmap synchronously看看简单的官方英文ImageSize targetSize = new ImageSize; // result Bitmap will be fit to this sizeBitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);

 

 最常使用的应该就是网络加载图片,网络请求完数据之后存到List数组中

Github:Android-Universal-Image-Loader对于开发者来说使用好的轮子的确是很重要的,要是上面出现错误的地方望指出并多多交流,要是有更好的简单封装方式感谢留言分享!

3.
实现自定义的MyApplication类,并初始化ImageLoader,注意要在Manifest的Application标签注明

 Picasso.with(AppApplication.getmContext())//上下文
                .load(list.get(i).getPath_vertical_s())//加载的地址
                .resize(94, 131)//设置显示的图片大小
                .placeholder(R.mipmap.ic_launcher)//图片较大加载慢时显示的图片
                .error(R.mipmap.birth)//加载错误时的图片
                .into(holder.iv_movie_abouttoshow_moviephoto);//指定显示图片的控件

****价值源于技术,贡献源于分享****

android:name=”.MyApplication”,否则还是使用的默认的Application类。

Picasso的缓存机制:

 

Picasso的缓存流程是先检查内存是否有保存该图片,如果没有则检查磁盘是否有保存该图片,如果没有则从网络下载,下载成功之后分别保存到内存和磁盘上各一份,如果我们有时候不想缓存该图片或者不想从缓存获取图片,该如何呢?Picasso也给我买提供了相应的控制方法。

[java] view
plaincopy

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

 

代码含义:该方法表示跳过从磁盘加载图片,并且图片下载之后也不在磁盘中进行缓存。

  1. public class MyApplication extends Application {  
  2.     @Override  
  3.     public void onCreate() {  
  4.         super.onCreate();  
  5.           
  6.         // This configuration tuning is custom. You can tune every option, you may tune some of them,   
  7.         // or you can create default configuration by  
  8.         //  ImageLoaderConfiguration.createDefault(this);  
  9.         // method.  
  10.         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())  
  11.                 .threadPriority(Thread.NORM_PRIORITY – 2)  
  12.                 .denyCacheImageMultipleSizesInMemory()  
  13.                 .discCacheFileNameGenerator(new Md5FileNameGenerator())  
  14.                 .tasksProcessingOrder(QueueProcessingType.LIFO)  
  15.                 .enableLogging() // Not necessary in common  
  16.                 .build();  
  17.           
  18.         //Initialize ImageLoader with configuration  
  19.         ImageLoader.getInstance().init(config);  
  20.     }  
  21. }  

参数介绍:

4.
配置图片加载及显示选项,此处有多种自定义配置选项,可以查看doc文档一一了解,这里就不赘述(实在太多)

    MemoryPolicy.NO_CACHE:直接跳过检查内存是否有缓存该图片

 

    MemoryPolicy.NO_STORE:图片下载之后不在内存中进行缓存

 

这里注意只是不在磁盘中缓存,但是会在内存中缓存,因此若内存和磁盘中都不想缓存则需要和
两个方法共同使用,如下:

[java] view
plaincopy

.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

 

NetworkPolicy枚举中还有一个值OFFLINE,这个表示强制从缓存中取,不会发起网络请求,如
果缓存中没有也不会从网络中请求

  1. DisplayImageOptions options = new DisplayImageOptions.Builder()  
  2.             .showStubImage(R.drawable.ic_launcher)  
  3.             .showImageForEmptyUri(R.drawable.ic_launcher)  
  4.             .showImageOnFail(R.drawable.ic_launcher)  
  5.             .cacheInMemory(true)  
  6.             .cacheOnDisc(false)  
  7.             .displayer(new RoundedBitmapDisplayer(20))  
  8.             .build();  

3、问题

 

使用Picasso时(另外两个框架也一样),记得有一次使用的死数据,图片地址批量复制的,复制的时候多操作了一个空格,结果就一直没显示,这也是个坑填一下。

5.
使用ImageLoader加载图片,这里以在ListView中为每个item异步加载图片为例,只要在Adapter的getView方法中调用如下方法即完成了异步列表图片加载,其中options是之前定义的图片加载和显示选项,animateFirstListener是当图片第一次加载的监听事件,目的在于显示一个淡入的显示效果动画,可以添加其他事件

二、Glide

  • 另外,本例还实现了当列表滑动过程中暂停加载和在用户手放开时才开始加载的功能,这样的好处是保证在列表图片异步加载的过程中不出现卡顿的现象,保证加载的顺滑性。实现这一功能的手段是使ListView监听一个由ImageLoader包含的监听事件PauseOnScrollListener。
  • 若设置cacheOnDisc(true)的话,则缓存的文件可以在/sdcard/Android/data/[package_name]/cache目录下看到。不过建议定期清理缓存,否则时间一长,SD卡就会被占满了,同时也可以在ImageLoaderConfiguration中配置SD的缓存策略,有限制缓存文件数量的,有限制缓存文件最大尺寸等选项。
  • 如果在使用过程中遭遇OOM异常,则建议在ImageLoaderConfiguration中设置threadPoolSize在1-5之间合适。在DisplayOption配置时使用。

Glide和Picasso其实挺相似的,不管是从使用方法还是从出身

三、Demo效果

1,还是和Picasso一样添加依赖

以下是Demo首页,提供了三种组件显示多图异步加载的方式:

compile 'com.github.bumptech.glide:glide:3.7.0'

图片 1

2,加载图片

 

 //1.网络加载图片到ImageView中,注意这里的大小设置方法和Picasso是有区别的
        Glide.with(context).load(imageUrl).override(94,131).into(imageView);

        //2.当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法
        Glide.with(context).load(imageUrl).placeholder(R.mipmap.ic_launcher).into(imageView);

        //3.当加载图片失败时,通过error(Drawable drawable)方法设置加载失败后的图片显示:
        Glide.with(context).load(imageUrl).error(R.mipmap.ic_launcher).into(imageView);

        //4.显示gif动画,asGif()判断是否是gif动画
        Glide.with(context).load(imageUrl).asGif().into(imageView);

        //5.显示本地视频
        String filePath = "/storage/emulated/0/demo/***.mp4";
        Glide.with( context ).load( Uri.fromFile( new File( filePath ) ) ).into(video );

        //6.缓存策略
        Glide.with( context ).load(imageUrl).skipMemoryCache(true).into(imageViewInternet );//跳过内存缓存
        Glide.with( context ).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.NONE).into( imageViewInternet );//跳过硬盘缓存

下面是ListView和GridView以及ViewPager加载显示的效果图,加载效果非常流畅:

三、Fresco

图片 2       
 图片 3       
  图片 4

Fresco使用和其他两个有些区别,因为这里要使用的不是ImageView了而是他自己的图片显示控件

以上只是简要介绍了一下ImageLoader的功能和使用概览,具体实现代码可以查看之前的原链接和下载我的工程代码查看,详细信息请参考官方文档:点击打开链接
工程下载:工程源码 云盘下载: Android图片异步加载之Android-Universal-Image-Loader由源码搜藏网整理,转载请注明出处

代码上:

<com.facebook.drawee.view.SimpleDraweeView
                android:id="@+id/iv_movie_abouttoshow_moviephoto"
                android:layout_width="93dp"
                android:layout_height="121dp"
                app:placeholderImage="@mipmap/ic_launcher" />

//其他的属性设置

fresco:fadeDuration="300" // 淡入淡出的持续时间
fresco:actualImageScaleType="focusCrop"  // 实际图像的缩放类型
fresco:placeholderImage="@color/wait_color"  //占位图
fresco:placeholderImageScaleType="fitCenter" //占位图的缩放类型
fresco:failureImage="@drawable/error" //下载失败显示的图片
fresco:failureImageScaleType="centerInside" //失败图的缩放类型
fresco:retryImage="@drawable/retrying"
//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片
fresco:retryImageScaleType="centerCrop" //重新加载的图片缩放类型
fresco:progressBarImage="@drawable/progress_bar" //进度条图片
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
//进度图自动旋转间隔时间(单位:毫秒ms)
fresco:backgroundImage="@color/blue"
//背景图片,这里的背景图片首先被绘制
fresco:overlayImage="@drawable/watermark"
// 设置叠加图,在xml中只能设置一张叠加图片,如果需要多张图片的话,需要在java代码中设置哦
fresco:pressedStateOverlayImage="@color/red"
// 设置点击状态下的叠加图
fresco:roundAsCircle="false" //设置为圆形图
fresco:roundedCornerRadius="1dp" // 圆角半径
fresco:roundTopLeft="true" // 左上角是否为圆角
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"
fresco:roundingBorderWidth="2dp" //边框的宽度
fresco:roundingBorderColor="@color/border_color" //边框颜色

 

如果你多次用了Fresco,建议在 Application
初始化,如果只是写着玩,就在应用调用 setContentView() 之前,进行初始化:

AppApplication

 Fresco.initialize(mContext);

加载图片

 Uri uri =  Uri.parse(list.get(i).getPath_vertical_s());
sdv.setImageURI(uri)
 DraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(uri)
                .setAutoPlayAnimations(true)
                .build();
        sdv.setController(controller);

以上就是三种框架的使用方法,此随笔当作学习笔记记录一下。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图