https://github.com/nostra13/Android-Universal-Image-Loader
ImageLoader作用
1.多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中
2.支持图片的内存缓存,文件系统缓存或者SD卡缓存
3.支持图片下载过程的监听
4.根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
加载第三方库
Gradle代码
‘com.nostra13.universalimageloader:universal-image-loader:1.9.4’
权限
1 2
|
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
ImageLoader加载的类型
1 2 3 4 5 6 7
|
"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 [用imageView.setImageResource(drawable)来代替]
|
ImageLoader的加载、显示配置:
加载Image时的配置(ImageLoaderConfiguration)
自定义配置 - 通过new ImageLoaderConfiguration.Builder().builder()方法进行实例化。
默认配置 - 通过ImageLoaderConfiguration 的createDefault进行实例化。
1 2 3 4 5 6 7 8 9
|
File diskCache = StorageUtils.getOwnCacheDirectory(context, "BNJ_IMAGE_CACHE/"); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) .diskCache(new UnlimitedDiscCache(diskCache)) // 设置缓存路径 .memoryCacheSize(2 * 1024) // 设置缓存的最大字节 .diskCacheFileNameGenerator(new Md5FileNameGenerator()) // 加密 .denyCacheImageMultipleSizesInMemory() // 禁止缓存显示不同大小的同一张图片 .memoryCacheExtraOptions(800, 760) // 保存每个缓存图片的最大长和宽 .diskCacheFileCount(100) //缓存的File数量 .build();
|
使用
通过ImageLoader的getInstance().init()方法传入上述options对象.
显示Image时的配置(DisplayImageOptions)
自定义配置 - 通过new DisplayImageOptions.Builder().builder()方法实例化对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_stub) // 设置加载时的图片 (使用loadImage方法加载时无效) .showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable .showImageOnFail(R.drawable.ic_error) // 设置加载失败的图片 .cacheInMemory(true) //设置使用内存缓存 .cacheOnDisk(true) //使用文件缓存 .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片 .bitmapConfig(Bitmap.Config.RGB_565) //减少内存消耗 .delayBeforeLoading(100) //设置下载图片前的延时 .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) .considerExifParams(false) //是否考虑JPEG图像EXIF参数(旋转,翻转) .build();
ImageSize size= new ImageSize(300,300);(大小可以通过创建ImageSize对象设置)
上述图片显示displayer //显示圆角 RoundedBitmapDisplayer //淡入显示 FadeInBitmapDisplayer
|
加载图片的方法
loadImage跟displayImage
A.ImageLoader.getInstance().loadImage(uri地址,图片大小,上述配置,监听器,进度监听器);
B.ImageLoader.getinstance().displayImage(uri地址,控件,上述配置,监听器,进度监听器);
区别
A方法可以设置图片大小,即自定义下载图片的大小
B方法会根据控件大小及ImageScaleType来裁剪图片
常用displayImage方法
监听器有两种
SimpleImageLoadingListener(简单的监听器)
ImageLoadingListener (该监听器能实现 加载图片取消时,失败时的方法)
ImageLoadingProgressListener
最后在监听器的onLoadingComplete方法里,设置图片显示即可
进阶
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
第一个参数是imageLoader,第二个参数是滑动时是否加载图片,第三个参数是猛的滑动时是否加载图片
OOM问题
如果使用了ImageLoader出现OutOfMemoryError的话,那么可以通过下列方法解决
关闭memory的cache。
减少线程池的大小
用Bitmap.Config.RGB565代替ARGB8888
使用.imageScaleType(ImageScaleType.EXACTLY 或ImageScaleType.IN_SAMPLE_INT)
使用.diskCacheExtraOption(480, 320, null)
获取缓存文件
1 2
|
DiskCache diskCache = ImageLoader.getInstance().getDiskCache(); File cacheFile = DiskCacheUtils.findInCache(imgpath, diskCache);
|
ImageView ScaleType
ImageLoader的使用及封装
使用
1.全局初始化ImageLoader,配置ImageLoader的参数(ImageLoaderConfiguration)
2.配置图片加载的参数(DisplayImageOptions)
3.创建ImageLoader的对象,调用displayImage方法
封装
1.利用单例模式创建ImageLoaderTool的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class ImageLoaderTool{
private static ImageLoader imageLoader;//用于全局初始化 private static ImageLoaderConfiguration configuration;//配置ImageLoader的参数
private static class Holder{ //单例模式 private static final ImageLoaderTool imageLoaderTool = new ImageLoaderTool(); }
public static ImageLoaderTool getInstance(){ if(configuration==null || imageLoader==null){ throw new RunTimeException ("Must be call the method InitImageLoader(Context context) in Application"); } return Holder.imageLoaderTool; } }
|
2.初始化ImageLoaderConfiguration
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public static void initImageLoader(Context context) { File diskCache = StorageUtils.getOwnCacheDirectory(context, "TJD_NBA/"); if (configuration == null) { configuration = new ImageLoaderConfiguration.Builder(context) .diskCache(new UnlimitedDiskCache(diskCache)) .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //md5加密 .memoryCacheSize(1024 * 2)//缓存最大字节 .memoryCache(new LruMemoryCache(5 * 1024 * 1024))//解决缓存listview滑动后显示默认图 .memoryCacheExtraOptions(800, 760)// 保存每个缓存图片的最大长和宽 .diskCacheFileCount(100) //缓存的File数量 .build(); } if (imageLoader == null) { imageLoader = ImageLoader.getInstance(); imageLoader.init(configuration); } }
|
3.封装DisplayImage方法
1 2 3 4 5 6 7 8 9
|
/** * 加载drawable图片,不能加载系统的drawable 即android:drawable * * @param resid * @param imageView */ public void loadImageFromDrawable(int resid, ImageView imageView) { imageLoader.displayImage(DRAWABLE_PREFIX + resid, imageView); }
|
示例 - 封装ImageLoader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
/** * ImageLoader的封装。单例模式 * 1. "http://site.com/image.png" // from Web * 2. "file:///mnt/sdcard/image.png" // from SD card * 3. "file:///mnt/sdcard/video.mp4" // from SD card (video thumbnail) * 4. "content://media/external/images/media/13" // from content provider * 5. "content://media/external/video/media/13" // from content provider (video thumbnail) * 6. "assets://image.png" // from assets * 7. "drawable://" + R.drawable.img // from drawables (non-9patch images)[用imageView.setImageResource(drawable)来代替] */ public class ImageLoaderTool {
private static ImageLoader imageLoader; //用于全局初始化 private static ImageLoaderConfiguration configuration;//默认的ImageLoader配置 private final String DRAWABLE_PREFIX = "drawable://";//用于加载drawable图像
private static class Holder { private static final ImageLoaderTool loaderTool = new ImageLoaderTool(); }
public static ImageLoaderTool getInstance() { if (imageLoader == null || configuration == null) { throw new RuntimeException("Must be call the method InitImageLoader(Context context) in Application"); } return Holder.loaderTool; }
// // 初始化ImageLoader // // @param context 在APP中 // public static void initImageLoader(Context context) { File diskCache = StorageUtils.getOwnCacheDirectory(context, "TJD_NBA/"); if (configuration == null) { configuration = new ImageLoaderConfiguration.Builder(context) .diskCache(new UnlimitedDiskCache(diskCache)) .diskCacheFileNameGenerator(new Md5FileNameGenerator()) //md5加密 .memoryCacheSize(1024 * 2)//缓存最大字节 .memoryCache(new LruMemoryCache(5 * 1024 * 1024))//解决缓存listview滑动后显示默认图 .memoryCacheExtraOptions(800, 760)// 保存每个缓存图片的最大长和宽 .diskCacheFileCount(100) //缓存的File数量 .build(); } if (imageLoader == null) { imageLoader = ImageLoader.getInstance(); imageLoader.init(configuration); } }
// // 默认图片加载参数 // private static DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() .cacheOnDisk(true) .cacheInMemory(true) .bitmapConfig(Bitmap.Config.RGB_565) .imageScaleType(ImageScaleType.EXACTLY) .showImageOnFail(R.drawable.side_nav_bar) .showImageForEmptyUri(R.drawable.side_nav_bar) .showImageOnLoading(R.drawable.side_nav_bar) .delayBeforeLoading(1000) .considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转) .build();
// // 加载普通图片 // // @param url // @param imageView // public void loadImage(String url, ImageView imageView) { imageLoader.displayImage(url, imageView, defaultOptions); }
// // 加载drawable图片,不能加载系统的drawable 即android:drawable // // @param resid // @param imageView // public void loadImageFromDrawable(int resid, ImageView imageView) { imageLoader.displayImage(DRAWABLE_PREFIX + resid, imageView); }
}
|
使用ImageLoader时加载相同URL的问题
//使用displayImage,而不使用loadImage,因为loadImage会导致当同时加载同一个url的时候出现task被取消的情况
//详情见https://github.com/nostra13/Android-Universal-Image-Loader/issues/804
1 2 3
|
// 解决方法 ImageSize size = new ImageSize(Functions.getScreenWidthPix(getActivity()), Functions.getScreenHeightPix(getActivity())); NonViewAware imageAware = new NonViewAware(size, ViewScaleType.CROP);
|
解决listvie宽度设置wwrap_content无效的方法
stackoverflow大佬
现象
listview宽度设置wrap_content无效
解决办法,添加FrameLayout跟LinearLayout设置weight
修改前代码
1 2 3 4 5 6 7 8 9 10 11 12
|
<ListView android:id="@+id/listView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.3" android:background="黑色" android:divider="@null" android:gravity="center" android:horizontalSpacing="7dp" android:numColumns="4" android:paddingLeft="@dimen/common_layout_margin_15dp" android:paddingRight="@dimen/common_layout_margin_15dp"></ListView>
|
修改后代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal">
<ListView android:id="@+id/listView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="0.3" android:background="黑色" android:divider="@null" android:gravity="center" android:horizontalSpacing="7dp" android:numColumns="4" android:paddingLeft="@dimen/common_layout_margin_15dp" android:paddingRight="@dimen/common_layout_margin_15dp"></ListView>
<FrameLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.7" android:background="蓝色" />
</LinearLayout>
|
https://tanjundang.github.io/2015/09/17/ImageLoaderTool/
- 转:iOS程序main函数之前发生了什么
原文地址:http://blog.sunnyxx.com/2014/08/30/objc-pre-main/ 我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口. ...
- 今日头条- iOS客户端 启动速度优化实践
版权声明 作者:今日头条iOS团队 原文:https://techblog.toutiao.com/2017/01/17/iosspeed/ 应用启动时间,直接影响用户对一款应用的判断和使用体验.头条 ...
- iOS程序main函数之前发生了什么
我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口.但对objc了解更多之后发现,程序在进入我们的main函数前已经执行了很多代码,比如熟知的+ load方法等. ...
- DNS域名解析中A、AAAA、CNAME、MX、NS、TXT、SRV、SOA、PTR各项记录的作用
名注册完成后首先需要做域名解析,域名解析就是把域名指向网站所在服务器的IP,让人们通过注册的域名可以访问到网站.IP地址是网络上标识服务器的数字地址,为了方便记忆,使用域名来代替IP地址.域名解析就是 ...
- Volley源码分析(2)----ImageLoader
一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...
- Volley(四)—— ImageLoader & NetworkImageView
Volley(四)—— ImageLoader & NetworkImageView ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码 ...
- ImageLoader实现图片异步加载
ImageLoader是一个广泛使用的图片库,在向网络请求图片时,使用imageView和smartView常会产生outofmemory错误,这时ImageLoader可以起到很大的作用,主要有如下 ...
- ImageLoader(多线程网络图片加载)+本地缓存 for windowsphone 7
搞了好长一阵子wp,做点好事. C/S手机app中应用最多的是 获取网络图片,缓存到本地,展示图片 本次主要对其中的delay:LowProfileImageLoader进行修改,在获取图片的时候, ...
- mybatis中@Param的用法和作用
用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 我们先来看Mapper接口中的@Select方法 package Ma ...
随机推荐
- php intval的取值范围:与操作系统相关
php intval的取值范围:与操作系统相关,32位系统上为-2147483648到2147483647,64位系统上为-9223372036854775808到922337203685477580 ...
- Java-字符串加密
1设计思想: 改程序是对小写的a到z进行加密,输入一段字符串str,输入加密的密匙k,判断录入的的字符与 ‘z’-k+1的大小,比其小的直接加上密匙转化为新的字符,大于的加(k-26)将最后几位字符转 ...
- PHP 正则表达式抓取网页内容。
我想用php抓取爱奇艺生活类型视频网页里面的元素,应该如何去做呢? 首先我要非常熟悉正则表达式,关于正则表达式的学习,我会写一篇博客一直学习的. 直接举例子: 这是一个爱奇艺生活视频的界面的网址 $u ...
- SQL Fundamentals || DCL(Data Control Language) || 系统权限&对象权限管理(GRANT&REVOKE)
SQL Fundamentals || Oracle SQL语言 语句 解释 Create user Creates a user(usually performed by a DBA) Grant ...
- django源码笔记-【1】(转)
add by zhj:第二段代码有修改 原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371181.html 前言 Django是一个开放源代 ...
- 万恶之源 - Python数据类型二
列表 列表的介绍 列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素用' , '隔开而且可以存放各 ...
- 置换检验(Permutation Test)学习[转载]
转自:https://www.cnblogs.com/bnuvincent/p/6813785.html http://www.bioinfo-scrounger.com/archives/564 1 ...
- iptables 常用命令
iptables service iptables save \\保存 iptables -F \\清空所有规则 iptables -F -t nat \\清空nat表 iptables -t nat ...
- Django之分页功能
Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表.元组或其它可迭代的对象. 基本语法 class Paginator(ob ...
- 使用masory
动态更新约束的时候老是提示有多余的约束,我使用update_contraits make_contraits 都不能解决,后来使用了remake_contraits才消除了告警. view pro ...