Android 网络图片加载缓存处理库ImageLoader和Picasso

知识的价值不在于占有,而在于使用。这篇文章主要讲述Android 网络图片加载缓存处理库ImageLoader和Picasso相关的知识,希望能为你提供帮助。
在android图片处理中需要考虑的问题很多,例如OOM、图片缓存和网络图片加载、多线程问题及图片压缩处理等等复杂的问题。网上也有一些很优秀的开源库帮我们处理这些问题,下面介绍两款开源图片处理库框架:Universal-ImageLoader和Picasso。
Universal-ImageLoader:
优点:

  • 支持本地图片和网络图片的多线程异步加载和缓存处理;
  • 个性化的配置自己项目的ImageLoader;
  • 图片加载过程的监听回调;
  • 自动对加载的图片针对当前剩余内存进行裁剪优化,防止OOM;
  • 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片;
缺点:
  • 没有对本地文件压缩处理的相关API方法以及默认都是Src模式设置图片,没有针对Background属性开放API。
开源库universal-image-loader-1.9.3.jar,简单使用代码如下: 
1 package com.zhang.imageloaderdemo; 2 3 import android.app.Application; 4 import android.graphics.Bitmap; 5 import android.os.Environment; 6 7 import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache; 8 import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator; 9 import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache; 10 import com.nostra13.universalimageloader.core.DisplayImageOptions; 11 import com.nostra13.universalimageloader.core.ImageLoader; 12 import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 13 import com.nostra13.universalimageloader.core.assist.ImageScaleType; 14 import com.nostra13.universalimageloader.core.assist.QueueProcessingType; 15 import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; 16 import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; 17 import com.nostra13.universalimageloader.core.download.BaseImageDownloader; 18 import com.nostra13.universalimageloader.core.download.ImageDownloader; 19 20 import java.io.File; 21 import java.io.IOException; 22 import java.io.InputStream; 23 24 /** 25* Created by Mr.Z on 2016/9/25 0025. 26*/ 27 public class MyApplication extends Application { 28 29@Override 30public void onCreate() { 31super.onCreate(); 32 33ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this) 34.memoryCacheExtraOptions(480, 800)//max width, max height,即保存的每个缓存文件的最大长宽 35.discCacheExtraOptions(480, 800, null)//设置缓存的详细信息,最好不要设置这个 36.threadPoolSize(3)//线程池内加载的数量 37.threadPriority(Thread.NORM_PRIORITY - 2) 38.denyCacheImageMultipleSizesInMemory() 39.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))//你可以通过自己的内存缓存实现 40.memoryCacheSize(2 * 1024 * 1024) 41.diskCacheSize(50 * 1024 * 1024) 42.discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密 43.tasksProcessingOrder(QueueProcessingType.FIFO) 44.discCacheFileCount(100)//缓存的文件数量 45.discCache(new UnlimitedDiscCache(new File(Environment.getExternalStorageDirectory() + "/imageLoader/imgCache")))//自定义缓存路径 46.defaultDisplayImageOptions(getDisplayOptions()) 47.imageDownloader(new BaseImageDownloader(this, 5 * 1000, 30 * 1000)) 48.writeDebugLogs() 49.build(); //开始构建 50 51ImageLoader.getInstance().init(configuration); 52 53} 54 55private DisplayImageOptions getDisplayOptions() { 56 57DisplayImageOptions options; 58options = new DisplayImageOptions.Builder() 59.showImageOnLoading(R.mipmap.ic_launcher)//设置图片在下载期间显示的图片 60.showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为空或是错误的时候显示的图片 61.showImageOnFail(R.mipmap.ic_launcher)//设置图片加载/解码过程中错误时候显示的图片 62.cacheInMemory(true)//设置下载的图片是否缓存在内存中 63.cacheOnDisk(true)//设置下载的图片是否缓存在SD卡中 64.considerExifParams(true)//是否考虑JPEG图像EXIF参数(旋转,翻转) 65.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示 66.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型 67 //.delayBeforeLoading(int delayInMillis)//设置的下载前的延迟时间 68 //.preProcessor(BitmapProcessor preProcessor)//设置图片加入缓存前,对bitmap进行设置 69.resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位 70.displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少 71.displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间 72.build(); 73 74return options; 75} 76 77 78 }

1 package com.zhang.imageloaderdemo; 2 3 import android.graphics.Bitmap; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.widget.ImageView; 9 10 import com.nostra13.universalimageloader.core.ImageLoader; 11 import com.nostra13.universalimageloader.core.assist.FailReason; 12 import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; 13 14 15 /** 16* 1.Universal-ImageLoader配置 17* 18* 2.用Universal-ImageLoader加载网络图片和本地图片 19*/ 20 public class MainActivity extends AppCompatActivity { 21 22private ImageLoader loader; 23private ImageView imgView; 24 25@Override 26protected void onCreate(Bundle savedInstanceState) { 27super.onCreate(savedInstanceState); 28setContentView(R.layout.activity_main); 29 30loader = ImageLoader.getInstance(); 31imgView = (ImageView) findViewById(R.id.img); 32//调用本地 33//String uri = "file:///" + "本地路径"; 34//网络 35 //loader.displayImage("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876& fm=21& gp=0.jpg",imgView); 36 37//监听 38loader.displayImage("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876& fm=21& gp=0.jpg", imgView, 39new ImageLoadingListener() { 40@Override 41public void onLoadingStarted(String s, View view) { 42Log.i("info", "onLoadingStarted"); 43} 44 45@Override 46public void onLoadingFailed(String s, View view, FailReason failReason) { 47Log.i("info", "onLoadingFailed"); 48} 49 50@Override 51public void onLoadingComplete(String s, View view, Bitmap bitmap) { 52Log.i("info", "onLoadingComplete"); 53} 54 55@Override 56public void onLoadingCancelled(String s, View view) { 57Log.i("info", "onLoadingCancelled"); 58} 59}); 60} 61 }

 
Picasso:
  • 加载载网络或本地图片并自动缓存处理;
  • 链式调用;
  • 图形转换操作,如变换大小,旋转等,提供了接口来让用户可以自定义转换操作;
  • 在Adapter中回收和取消当前的下载功能。
  除了加载网络图片,picasso还支持加载Resources, assets, files, content  providers中的本地资源文件。
开源库picasso-2.4.0.jar,使用如下:
1 package com.zhang.picassodemo; 2 3 import android.support.v7.app.AppCompatActivity; 4 import android.os.Bundle; 5 import android.widget.ImageView; 6 7 import com.squareup.picasso.Picasso; 8 9 public class MainActivity extends AppCompatActivity { 10 11@Override 12protected void onCreate(Bundle savedInstanceState) { 13super.onCreate(savedInstanceState); 14setContentView(R.layout.activity_main); 15 16ImageView imgView = (ImageView) findViewById(R.id.img); 17 18Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876& fm=21& gp=0.jpg") 19.into(imgView); 20 ////图片缩放 21 //Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876& fm=21& gp=0.jpg") 22 //.resize(50, 50) 23 //.into(imgView); 24 ////设置出错显示图标 25 //Picasso.with(this).load("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876& fm=21& gp=0.jpg") 26 //.error(R.mipmap.ic_launcher) 27 //.into(imgView); 28 29} 30 }

【Android 网络图片加载缓存处理库ImageLoader和Picasso】   

    推荐阅读