Volley图片加载并加入缓存处理(转自http://blog.csdn.net/viewhandkownhealth/article/details/50957024)
直接上代码 两种方式 ImageView 和NetworkImageView
如有问题或者好的建议、意见 欢迎大家加入技术群(群号: 387648673 )
先自定义全局Application 获取
public classMyApplication extends Application {
private static RequestQueuerequestQueue;
private static MyApplicationapplication;
@Override
public void onCreate() {
// TODO Auto-generated methodstub
super.onCreate();
application = this;
requestQueue =Volley.newRequestQueue(this);
}
public static MyApplicationgetInstance() {
// TODO Auto-generated methodstub
return application;
}
public static RequestQueuegetRequestQueue(){
return requestQueue;
}
}
先上布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_test1"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="10dp"/>
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/iv_test2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp" >
</com.android.volley.toolbox.NetworkImageView>
</LinearLayout>
方式一用ImageView加载
需要封装一下自定义的BitmapCache类实现图片缓存接口ImageCache
public class BitmapCache implements ImageCache{
public LruCache<String, Bitmap> cache;
public BitmapCache(){
int maxMermorySize = (int)(Runtime.getRuntime().maxMemory()/1024);
cache = new LruCache<String, Bitmap>(maxMermorySize/8){
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getRowBytes()*value.getHeight()/1024;
}
};
}
@Override
public Bitmap getBitmap(String key) {
// TODO Auto-generated method stub
return cache.get(key);
}
@Override
public void putBitmap(String key, Bitmap value) {
// TODO Auto-generated method stub
cache.put(key, value);
}
}
方式二 用NetworkImageView记载
封装一个VolleyUtils图片加载并处理缓存的类,使用起来就比较方便了
public class VolleyUtils {
private static ImageLoader imageLoader;
private static LruCache<String,Bitmap> lruCache;
private static HashMap<String,SoftReference<Bitmap>> softmap;
private static void initCache() {
// TODO Auto-generated method stub
//实例化二级缓存
softmap = new HashMap<String, SoftReference<Bitmap>>();
//实例化一级缓存 字节单位 KB
int maxMermorySize = (int)(Runtime.getRuntime().maxMemory()/1024);
lruCache = new LruCache<String, Bitmap>(maxMermorySize/8){
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
//return lruCache.size()
return value.getRowBytes()*value.getHeight()/1024;//返回KB的大小
}
@Override
protected void entryRemoved(boolean evicted, String key,
Bitmap oldValue, Bitmap newValue) {
//当oldValue被一级缓存逐出时,放入二级缓存中
if (evicted) {
softmap.put(key, new SoftReference<Bitmap>(oldValue));
}
}
};
}
public static ImageLoader getImageLoader(Context context){
if (imageLoader==null) {
initCache();
imageLoader = new ImageLoader(MyApplication.getRequestQueue(), new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
// 存入一级缓存
lruCache.put(url, bitmap);
}
@Override
public Bitmap getBitmap(String url) {
//从一级缓存中获取
Bitmap bitmap = lruCache.get(url);
//判断一级缓存是否存在
if ( bitmap== null) {//一级缓存不存在
//从二级缓存中获取
SoftReference<Bitmap> softRef = softmap.get(url);
if (softRef!=null) {
bitmap = softRef.get();
//获取软引用中图片
//为了便于使用将二级缓存中的图片存放一级缓存中
lruCache.put(url, bitmap);
//将此图片从二级缓存中移除
softmap.remove(url);
}
}
return null;
}
});
}
return imageLoader;
}
}
在Activity或者Fragment或者适配中可以直接调取用,下边是以Activity为实例的代码
private ImageView test1;//用ImageView加载网略图片
private NetworkImageView test2;//用NetworkImageView记载网略图片
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
test1 = (ImageView)findViewById(R.id.iv_test1);
test2 = (NetworkImageView) findViewById(R.id.iv_test2);
initImage();
}
private void initImage(){
//本人随便找了一张美女的图片
String url = "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1205/25/c2/11755122_1337938898582.jpg";
//方式一用ImageView加载
ImageLoader loader = new ImageLoader(MyApplication.getRequestQueue(), new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(test1,
R.drawable.ic_launcher, R.drawable.ic_launcher);
loader.get(url, listener);
//方式二用NetworkImageView加载
ImageLoader imageLoader = VolleyUtils.getImageLoader(this);
test2.setDefaultImageResId(R.drawable.ic_launcher);
test2.setErrorImageResId(R.drawable.ic_launcher);
test2.setImageUrl(url, imageLoader);
}
Volley图片加载并加入缓存处理(转自http://blog.csdn.net/viewhandkownhealth/article/details/50957024)的更多相关文章
- Volley 图片加载相关源码解析
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...
- Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计
Volley是由Google开源的.用于Android平台上的网络通信库.Volley通过优化Android的网络请求流程,形成了以Request-RequestQueue-Response为主线的网 ...
- 【第三篇】Volley图片加载之NetworkImageView代码分析
在Volley的使用之加载图片讲过使用NetWorkImageView进行图片加载的例子,本文着重讲解NetWorkImageView内部是如何实现的,以及Volley这个控件有什么特性. 1,通 ...
- android-------非常好的图片加载框架和缓存库(Picasso)
Picasso是Square公司开源的一个Android图形缓存库, 可以实现图片加载(本地和网络)和缓存功能. 地址:http://square.github.io/picasso/ jar包下载: ...
- iOS Cell异步图片加载优化,缓存机制详解
最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载, ...
- 网页中通过js修改img的src属性刷新图片时,图片缓存问题现象表述及问题解决【ps:引用大神案例http://blog.csdn.net/goodleiwei/article/details/50737548】
问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过fir ...
- JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...
- spring加载hibernate映射文件的几种方式。转自:http://blog.csdn.net/huiwenjie168/article/details/7013618
在Spring的applicationContext.xml中配置映射文件,通常是在<sessionFactory>这个Bean实例中进行的,若配置的映射文件较少时,可以用sessionF ...
- 谁动了我的内存:php内存泄露,系统缓存消耗? 转摘:http://blog.csdn.net/tao_627/article/details/9532497
http://www.laruence.com/2011/03/04/1894.html 前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨. 情景:线上图片服务压缩的图片品质(100),缩 ...
随机推荐
- 201521123088《Java程序设计》第6周学习总结
1. 本周学习总结 2. 书面作业 clone方法1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? ...
- 学号:201521123116 《java程序设计》第四周学习总结
1. 本周学习总结 2. 书面作业 Q1. 注释的应用使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图)答:注释的插入:注释以/开始,以/结束类注释/**.... ...
- 201521123024《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- JAVA课程设计 猜数游戏 团队
团队名称,成员介绍 名称: 猜数游戏 成员: 网络1514 201521123086 周颖强 网络1514 201521123087蒋勃超 项目git地址 git.oschina.net/jbc113 ...
- 201521123103 《Java学习笔记》 第十一周学习总结
一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 二.书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...
- 201521123019 《java程序设计》 第14周学习总结
1. 本章学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) ...
- JS运动缓冲的封装函数
之前经常写运动函数,要写好多好多,后来想办法封装起来.(运动缓冲). /* 物体多属性同时运动的函数 obj:运动的物体 oTarget:对象,属性名为运动的样式名,属性值为样式运动的终点值 rati ...
- linux文件截取前几行,后几行,中间几行命令
1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /etc/passwd 2. 如果你想查看文件的后10行,可以使用tail命令,如: tail -2 /etc/passwd ...
- JDBC操作数据库之连接数据库
通过JDBC向数据库中添加数据的时候,使用insert语句实现数据的插入,再SQL语句中的参数可以用占位符"?"来替代,然后通过PreparedStatement对象或者State ...
- 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)
要进行网络编程,首先要搞清楚目的是什么. 网络编程说简单点就是在网络上的计算机进行数据的交互. 既然要进行数据交互,那就需要有一个发送方和一个接受方. 按网络上的说法,就是一个攻一个受· 当然,现阶段 ...