直接上代码  两种方式 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)的更多相关文章

  1. Volley 图片加载相关源码解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47721631: 本文出自:[张鸿洋的博客] 一 概述 最近在完善图片加载方面的 ...

  2. Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计

    Volley是由Google开源的.用于Android平台上的网络通信库.Volley通过优化Android的网络请求流程,形成了以Request-RequestQueue-Response为主线的网 ...

  3. 【第三篇】Volley图片加载之NetworkImageView代码分析

    在Volley的使用之加载图片讲过使用NetWorkImageView进行图片加载的例子,本文着重讲解NetWorkImageView内部是如何实现的,以及Volley这个控件有什么特性.   1,通 ...

  4. android-------非常好的图片加载框架和缓存库(Picasso)

    Picasso是Square公司开源的一个Android图形缓存库, 可以实现图片加载(本地和网络)和缓存功能. 地址:http://square.github.io/picasso/ jar包下载: ...

  5. iOS Cell异步图片加载优化,缓存机制详解

    最近研究了一下UITbleView中异步加载网络图片的问题,iOS应用经常会看到这种界面.一个tableView上显示一些标题.详情等内容,在加上一张图片.这里说一下这种思路. 为了防止图片多次下载, ...

  6. 网页中通过js修改img的src属性刷新图片时,图片缓存问题现象表述及问题解决【ps:引用大神案例http://blog.csdn.net/goodleiwei/article/details/50737548】

    问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过fir ...

  7. JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)

    Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...

  8. spring加载hibernate映射文件的几种方式。转自:http://blog.csdn.net/huiwenjie168/article/details/7013618

    在Spring的applicationContext.xml中配置映射文件,通常是在<sessionFactory>这个Bean实例中进行的,若配置的映射文件较少时,可以用sessionF ...

  9. 谁动了我的内存:php内存泄露,系统缓存消耗? 转摘:http://blog.csdn.net/tao_627/article/details/9532497

    http://www.laruence.com/2011/03/04/1894.html 前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨. 情景:线上图片服务压缩的图片品质(100),缩 ...

随机推荐

  1. 201521123017 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 Q1.网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 1.2 te ...

  2. Java课程设计-随机密码生成器

    1.团队课程设计博客链接 团队课程设计博客地址 2.个人负责模板 随即密码生成器算法 3.自己的代码提交记录截图 4.自己负责模块或任务详细说明 负责随机密码算法设计实现 通过不同种类选择下生成密码, ...

  3. 201521123049 《JAVA程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...

  4. Exception in thread "main" org.hibernate.MappingException: You may only specify a cache for root

    如果出现类似下面的错误: Exception in thread "main" org.hibernate.MappingException: You may only speci ...

  5. struts2前后台交互

    1.前台到后台A.form提交,后台用getParameter()方法拿到数据:B.url用?+&C.Ajax使用data:{username:account,password:passwor ...

  6. react基础(2)

    react基础(1):介绍了如何创建项目,总结了JSX.组件.样式.事件.state.props.refs.map循环,另外还讲了mock数据和ajax 还是用 react基础1 里创建的项目继续写案 ...

  7. SYSTEM_INFO

    SYSTEM_INFO结构体包含了当前计算机的信息.这个信息包括计算机的体系结构.中央处理器的类型.系统中中央处理器的数量.页面的大小以及其他信息. SYSTEM_INFO,Win32 API函数Ge ...

  8. redhat下yum命令安装(替换为centos yum命令)

    redhat默认自带的yum源需要注册,才能更新,报错:This system is not registered to Red Hat Subscription Management. You ca ...

  9. Hive内置数据类型

    Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括:TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBL ...

  10. poj2891非互质同余方程

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8176   ...