相信大家在学习以及实际开发中基本都会与网络数据打交道,而这其中一个非常影响用户体验的就是图片的缓存了,若是没有弄好图片缓存,用户体验会大大下降,总会出现卡顿情况,而这个问题尤其容易出现在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 <RelativeLayout
3 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,第三个参数控制很快速的滑动的时候图片是否加载。

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

android使用ImageLoader实现图片缓存(安卓开发必备)的更多相关文章

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

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

  2. ADT bundle和Eclipse和Android Studio有什么区别?安卓开发该用哪个?

    这三个版本的出现有一定的历史的原因:1.最开始只有eclipse+独立的adt一种开发环境,但是由于eclipe作为一种通用的ide,带来的问题太多,经常出现eclipse的版本不兼容adt的情况,或 ...

  3. Android 百度地图定位(手动+自动) 安卓开发教程

    近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究 ...

  4. Android学习笔记(一)——安卓开发环境搭建

    安装教程以及资源(2015.11.8最新版):链接:http://pan.baidu.com/s/1kTnOsMr 密码:0ogf

  5. 【Android入门】一个App学会安卓开发

    一.程序项目架构

  6. Android list加载图片工具类

    总体思路 Handler + looper + message 核心类 package com.base.imagechoose.util; import android.graphics.Bitma ...

  7. 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)

    在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...

  8. Android开发笔记——图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...

  9. 安卓高级 Android图片缓存之初识Glide

    前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...

随机推荐

  1. 设计爬虫Hawk背后的故事

    本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...

  2. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  3. ABP框架 - Swagger UI 集成

    文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...

  4. jQuery学习之路(6)- 简单的表格应用

    ▓▓▓▓▓▓ 大致介绍 在CSS技术之前,网页的布局基本都是依靠表格制作,当有了CSS之后,表格就被很多设计师所抛弃,但是表格也有他的用武之地,比如数据列表,下面以表格中常见的几个应用来加深对jQue ...

  5. C#中将DataTable导出为HTML的方法

    今天我要向大家分享一种将DataTable导出为到HTML格式的方法.有时我们需要HTML格式的输出数据, 以下代码就可以帮助我们达到目的,. 首先,我们要绑定DataTable和 DataGridV ...

  6. 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签

    今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...

  7. CSS——关于z-index及层叠上下文(stacking context)

    以下内容根据CSS规范翻译. z-index 'z-index'Value: auto | <integer> | inheritInitial: autoApplies to: posi ...

  8. [原]分享一下我和MongoDB与Redis那些事

    缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...

  9. Register-SPWorkflowService 404

    最近需要做一个SharePoint 2013工作流演示环境. 于是在自己的本子上安装了一个虚拟机. 虚拟机操作系统是Windows Server 2012 R2,计划把AD.SQL Server 20 ...

  10. Unicode 和 UTF-8 有何区别?

    Unicode符号范围 (一个字符两个字节)     | UTF-8编码方式 (十六进制)     | (二进制) —————————————————————– 这儿有四个字节从-----00 00 ...