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 }
时间: 2024-11-08 19:18:10

Android 网络图片加载缓存处理库ImageLoader和Picasso的相关文章

android网络图片加载缓存,避免重复加载。

1.主线程调用方法: imageView = new ImageView(this); AsynImageLoader asynImageLoader = new AsynImageLoader(); asynImageLoader.showImageAsyn(imageView, URL, R.drawable.nopicture); mViewList.add(imageView); 2.AsynImageLoader加载缓存:     public void showImageAsyn(I

Android WebView加载Chromium动态库的过程分析

Chromium动态库的体积比较大,有27M左右,其中程序段和数据段分别占据25.65M和1.35M.如果按照通常方式加载Chromium动态库,那么当有N个正在运行的App使用WebView时,系统需要为Chromium动态库分配的内存为(25.65 + N x 1.35)M.这是非常可观的.为此,Android使用了特殊的方式加载Chromium动态库.本文接下来就详细分析这种特殊的加载方式. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 为什么当有

优化ListView中的网络图片加载 及 Volley库源码分析

使用适当的开源库,如Volley或者Universal ImageLoader 以Volley库为例.Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程. 主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题.如下图: 其中左下角是NetworkDispatcher线程,大致步骤是: 1.不断从请求队列中取出请求 request = mQueue.take(); 2.发起网络请求 NetworkResp

安卓加载缓存处理库的使用

Universal_imageLoader的使用: 1,图片处理的常见问题. oom内存溢出, 图片尺寸和缩略图的处理平衡 网络图片加载和缓存机制 Universal-ImageLoader特点:? 支持本地图片和网络图片的多线程异步加载和缓存处理? 个性化的配置自己项目的ImageLoader? 图片加载过程的监听回调? 自动对加载的图片针对当前剩余内存进行裁剪优化,防止OOM? 较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片 1,配置application package co

面试之路(5)-阿里面试题android网络图片加载优化

题目: 遇到网络不好,卡顿的时候如何对网络的加载图片进行优化? 思路: 从加载的图片的本身和手机的存储两方面考虑 解决办法: 1.找现有图片格式的替换者 在众多的图片格式中,选择了Google的WebP.原因很简单:压缩效率高,而且对Android的支持好(毕竟就是Google提出来的).使用 WebP 之后,相对于JPG格式的图片,流量省了将近 25% 到 35 %:相对于 PNG 格式的图片,流量省了将近80%.最重要的是使用WebP之后图片质量还没改变. 2.按照设备处理图片的能力来加载图

一起写一个Android图片加载框架

本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做出比较,来帮助我们量化这个框架的性能.通过开发这个框架,我们可以进一步深入了解Android中的Bitmap操作.LruCache.LruDiskCache,让我们以后与Bitmap打交道能够更加得心应手.若对Bitmap的大小计算及inSampleSize计算还不太熟悉,请参考这里:高效加载Bit

★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

Android图片加载库的理解

前言 这是“基础自测”系列的第三篇文章,以Android开发需要熟悉的20个技术点为切入点,本篇重点讲讲Android中的ImageLoader这个库的一些理解,在Android上最让人头疼是从网络中获取图片,显示,回收,任何一个环节有问题都可能直接OOM,当需要加载大量的图片的时候,每当快速滑,有时候会很卡,甚至会因为内存溢出而崩溃.这里讲解的库是:Universal_Image_Loader. 内容目录 ImageLoader设计原理 ImageLoader流程图 ImageLoader的使

Android开发之搜芽项目的图片加载问题(使用Volley进行网络图片加载)

搜芽的移动开发这几天进度相对来说非常的快.但是美中不足的就是网络图片的加载问题.我有两套方案: 1)沿用迅雷动漫的图片加载.迅雷动漫也是用的一个开源的库.但是不知道是我使用出了问题还是真的是它的问题.在我迅速的下拉和回倒的时候, 不确定的会出现崩溃.logcat显示loadImage里面出现了内存溢出.out of memory..这个我想应该不是我的问题. 2)采用外包的AsyncImageLoader.这个文件我没有仔细看.然后实验结果是,加载图片巨慢.而且容易导致卡顿. 所以,我将希望转向