Android 网络图片加载缓存处理库ImageLoader和Picasso
Posted changchou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 onLoadingStarted(String s, View view) { 42 Log.i("info", "onLoadingStarted"); 43 } 44 45 @Override 46 public void onLoadingFailed(String s, View view, FailReason failReason) { 47 Log.i("info", "onLoadingFailed"); 48 } 49 50 @Override 51 public void onLoadingComplete(String s, View view, Bitmap bitmap) { 52 Log.i("info", "onLoadingComplete"); 53 } 54 55 @Override 56 public void onLoadingCancelled(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的主要内容,如果未能解决你的问题,请参考以下文章