相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在ListView中的Item有图片的情况中。

前面与大家分享了一个网络连接框架Retrofit,里面也有类似的图片加载的picasso,大家都可以去体验,直通车:http://www.cnblogs.com/liushilin/p/5680135.html

当然还有当前我认为最好用的图片缓存加载框架Fresco,直通车:http://www.cnblogs.com/liushilin/p/5659301.html

大家可能有所不解,为什么有这么好的框架Fresco了,楼主为什么还要分享这个ImageLoader呢?什么鬼。或许大家看法不一样嘛,总之各有各存在的意义,具体就大家自行甄别咯。

项目已同步至:https://github.com/nanchen2251/ImageLoaderDemo

1)先来看看ImageLoader框架的特征。

①多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等

②支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置

③支持图片的内存缓存,文件系统缓存或者SD卡缓存

④支持图片下载过程的监听

⑤根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存

⑥较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片

⑦提供在较慢的网络下对图片进行加载

2)然后要使用它,肯定得添加这个支持包,在studio里面支持直接add,搜索Image-loader即可进行网络添加,需要看它源码的也可以去github网上gank.

3)先来一个简单使用,加载一张网络图片,只需要两行代码,可见其简单之处。

 1 <?xml version="1.0" encoding="utf-8"?>2 <RelativeLayout3     xmlns:android="http://schemas.android.com/apk/res/android"4     xmlns:tools="http://schemas.android.com/tools"5     android:layout_width="match_parent"6     android:layout_height="match_parent"7     tools:context="com.example.nanchen.imageloaderdemo.MainActivity">8 9     <ImageView
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:src="@mipmap/ic_launcher"
13         android:id="@+id/main_image"
14         android:layout_centerInParent="true"/>
15 </RelativeLayout>

再看看Activity

package com.example.nanchen.imageloaderdemo;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; public class MainActivity extends AppCompatActivity { private String imageUrl = "http://pic.cnblogs.com/face/845964/20160301162812.png"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = (ImageView) findViewById(R.id.main_image); ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));//初始化完成  ImageLoader.getInstance().displayImage(imageUrl,imageView); } }

由于是访问网络图片,所以别忘了添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

  

运行图:

很简单有木有,不用你去写网络访问,不用你去异步执行,只要两句话,只要两句话!!!

4)当然,你还可以尽情的设置它,上面只是用了简单的Default属性,实际开发中我们可能需要自己按照自己的需求去写它,这里就设置了加载失败显示的图片,还有对于缓存机制的管理等。

 1 //图片展示的管理操作2         DisplayImageOptions options = new DisplayImageOptions.Builder()3                 .cacheInMemory(true)4                 .cacheOnDisk(true)5                 .displayer(new RoundedBitmapDisplayer(20))6                 .showImageOnFail(R.mipmap.ic_launcher)7  .bitmapConfig(Bitmap.Config.RGB_565) 8  .build(); 9 10 11 //这样自定义设置后就可以管理二级缓存和三级缓存了 12 ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this) 13 .memoryCacheSizePercentage(20)//设置占用内存的百分比 14 .diskCacheFileCount(100)//设置最大下载图片数 15 .diskCacheSize(5 * 1024 * 1024) 16  .defaultDisplayImageOptions(options) 17  .build(); 18 19 ImageLoader.getInstance().init(configuration);//初始化完成 20 ImageLoader.getInstance().displayImage(imageUrl,imageView);

这里还有很多其他的属性啦。

当然其中使用ImageLoader加载网络图片并不是只有displayImage这个方法的,只是我觉得这是它的方法中相对简单的一种了。

它其实还有loadImage(),loadImageSync()两种方式,loadImageSync()方法是同步的,android4.0有个特性,网络操作不能在主线程,所以loadImageSync()方法我们就不去使用了。对于另外的方式大家可以自行尝试,不过我的确很推荐上面的方法了。

4)另外ImageLoader自然也是支持加载sd卡图片和Content provider等,使用起来也比较简单,只需要简单添加两句话即可

1         String imagePath = "/mnt/sdcard/image.png";
2         String imageUrl = ImageDownloader.Scheme.FILE.wrap(imagePath);
3
4         ImageLoader.getInstance().init(configuration);//初始化完成
5         ImageLoader.getInstance().displayImage(imageUrl,imageView);

5)当然,我相信要使用图片加载框架,更多的人是用ListView和GridView来显示大量的图片,而当我们快速地滑动滚动条的时候,如果同时进行网络加载的话,我们会发现性能大受迎新,那样会出现卡顿情况严重。所以我们应该在滑动的时候不允许加载图片,待滑动结束的时候才加载,这个框架自然少不了这个功能,它提供了PauseOnScrollListner.

lv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gv.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));  

其中的三个参数很简单,第一个是我们的ImageLoader的实例对象,第二个是boolean型参数,需要停止滑动的时候传入一个true,第三个参数控制很快速的滑动的时候图片是否加载。

说了这么多,也差不多了,安卓很多东西,你只有去尝试,你才会知道其中的奥妙,趁年少轻狂,好好搞一波疯狂。

转载于:https://www.cnblogs.com/liushilin/p/5689554.html

android使用ImageLoader实现图片缓存(安卓开发必备)相关推荐

  1. android实现电话功能实验报告,安卓开发实验报告-20210407005833.docx-原创力文档

    文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 安卓开发实验报告 安卓开发实验报告 目录 页面跳 ...

  2. android仿微信点击好友,安卓开发仿微信联系人列表-机器人列表视图仿微通道聊天多久最底部滑动...

    楼主你好!根据你的描述,让我给你答案! :新内容加进来,列表视图重新为setSelection后,定位结束后,拉起一个页面放. . 希望你能有所帮助,如果满意,请记得采纳像下拉条为微信好友如何实现 简 ...

  3. ym——android源代码大放送(实战开发必备)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 目录 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.c ...

  4. android 神器 自动连接手机软件,安卓手机必备的4款神器黑科技APP!一个比一个厉害,请谨慎使用...

    原标题:安卓手机必备的4款神器黑科技APP!一个比一个厉害,请谨慎使用 1.氢应用 氢应用真的是一个非常黑科技的APP,一个APP相当于几十个APP,并且不占用手机本地内存,非常方便.它提供很多插件, ...

  5. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

  6. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar

    什么是ProgressBar ProgressBar是用于提示用户进行等待的UI控件,. 基础样例 1.loading图 效果图 代码 布局文件代码 <ProgressBarandroid:id ...

  7. Android中的羊角符,安卓开发binder

    两种羊角符 ===== 百度百科中给了如下羊角符定义: 人民币符号为:¥.书写顺序为:先写大写字母"Y",再在竖划上加上二横,即为"¥",读音为:yuán(音: ...

  8. android模拟器MAC无法联网(安卓开发)

    1.终端打开 安卓SDK下的emulator [hb@gaoyuyang18478 ~ % cd /Users/gaoyuyang18478/CONFIG_HOME/ASDK/emulator 这里的 ...

  9. android加载ftp图片,按键安卓版网络访问之 图片处理,FTP,HTTP 实现

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 必备工具: 1.海草同步器 下载地址: http://pan.baidu.com/s/1c0nLwi8 2.修改版 File.lua : http://p ...

最新文章

  1. 《C++语义和性能分析》读书笔记
  2. webp-imageio 如何编译及使用
  3. vue的$nextTick使用总结,this.$refs为undefined的解决办法,element Ui的树形控件setCheckedKeys方法无法使用
  4. python线程信号量semaphore
  5. 通过微软的cors类库,让ASP.NET Web API 支持 CORS
  6. Android横竖屏切换的生命周期
  7. 【原型设计】实用节:Axure RP9 的一些常用的快捷按键组合操作
  8. Java从入门到精通 第21章 Annotation
  9. android发送短信界面,android调用系统发送短信 和 已发送短信界面
  10. 计算机五个盘,电脑分盘分几个盘合适,您知道吗?
  11. JS-BOM基本概念
  12. java中md5加密和解密_java的MD5加密与解密
  13. 层次时间序列预测指南
  14. oracle18c升级19,Upgrading Oracle 18c To 19c
  15. 【沃顿商学院学习笔记】商业基础——Financing:05 名义利率和实际利率 APR EAR
  16. 如何用微博传播小电影
  17. Linux下Docker安装微信文件传输问题
  18. mysql数据库在线测试_测试面试题集-MySQL数据库灵魂拷问
  19. 解析信号与Matlab hilbert函数
  20. 扫盲:什么是单片机时序,如何看懂时序图

热门文章

  1. Zxing二维码精简(竖屏、拉伸处理、扫描框大小和扫描线移动)
  2. Unity3D 深度图
  3. 「 每日一练,快乐水题 」1791. 找出星型图的中心节点
  4. easyExcel 读取数据为空的一次报错记录
  5. HashSet、TreeSet、TreeMap实现原理
  6. Linux下实现USB口的热插拔
  7. YOLO-目标检测中计算AP、MAP方法
  8. 计算机组装与维护补考论文,计算机组装与维护期末论文
  9. impala 连接mysql_impala系列: 基本命令和jdbc连接
  10. scrapy爬虫代理——利用crawlera神器,无需再寻找代理IP