首页 > 代码库 > 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
30     public void onCreate() {
31         super.onCreate();
32 
33         ImageLoaderConfiguration 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 
51         ImageLoader.getInstance().init(configuration);
52 
53     }
54 
55     private DisplayImageOptions getDisplayOptions() {
56 
57         DisplayImageOptions options;
58         options = 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 
74         return 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 
22     private ImageLoader loader;
23     private ImageView imgView;
24 
25     @Override
26     protected void onCreate(Bundle savedInstanceState) {
27         super.onCreate(savedInstanceState);
28         setContentView(R.layout.activity_main);
29 
30         loader = ImageLoader.getInstance();
31         imgView = (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         //监听
38         loader.displayImage("http://img0.imgtn.bdimg.com/it/u=4019581940,3959990876&fm=21&gp=0.jpg", imgView,
39                 new ImageLoadingListener() {
40                     @Override
41                     public void onl oadingStarted(String s, View view) {
42                         Log.i("info", "onLoadingStarted");
43                     }
44 
45                     @Override
46                     public void onl oadingFailed(String s, View view, FailReason failReason) {
47                         Log.i("info", "onLoadingFailed");
48                     }
49 
50                     @Override
51                     public void onl oadingComplete(String s, View view, Bitmap bitmap) {
52                         Log.i("info", "onLoadingComplete");
53                     }
54 
55                     @Override
56                     public void onl oadingCancelled(String s, View view) {
57                         Log.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
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate(savedInstanceState);
14         setContentView(R.layout.activity_main);
15 
16         ImageView imgView = (ImageView) findViewById(R.id.img);
17 
18         Picasso.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