Volley来加载网络图片

Volley来加载网络图片

ImageRequest用法
  1. 创建一个RequestQueue对象。
  2. 创建一个Request对象。
  3. 将Request对象添加到RequestQueue里面。

例子

  String url ="http://android.tgbus.com/news/UploadFiles_8153/201208/2012081013531630.jpg";

    RequestQueue requestQueue = Volley.newRequestQueue(this);

    /**
     * ImageRequest的构造函数接收六个参数,
     * 第一个参数就是图片的URL地址,
     * 第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。
     * 第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压    缩,指定成0的话就表示不管图片有多大,都不会进行压缩。
     * 第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。
     * 第六个参数是图片请求失败的回调
     */
    ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap bitmap) {

            mIv1.setImageBitmap(bitmap);

        }
    }, 0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.RGB_565, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            Log.d("vivi", "onErrorResponse: "+error.getMessage());
        }
    });

    requestQueue.add(imageRequest);
使用ImageLoader加载图片
  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 获取一个ImageListener对象。

  4. 调用ImageLoader的get()方法加载网络上的图片。

     //创建请求队列
      RequestQueue requestQueue = Volley.newRequestQueue(this);
      //创建ImageLoader
     ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
         @Override
         public Bitmap getBitmap(String url) {
    
             return null;
         }
    
         @Override
         public void putBitmap(String url, Bitmap bitmap) {
    
         }
     });
    

第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象,这里是个空对象,没有实现
ImageCache对象是一个空的实现,完全没能起到图片缓存的作用。其实写一个ImageCache,但是如果想要写一个性能非常好的ImageCache,最好就要借助Android提供的LruCache功能了见最下面
<a href="#overview">Overview</a>
需要获取一个ImageListener对象

      /**
     * 第一个要显示在哪个控件
     * 第二个 默认的资源图片
     * 第三个 错误的资源图片
     */
    ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(mIv2,R.mipmap.ic_launcher,R.mipmap.ic_launcher);

    //调用ImageLoader的get()方法来加载图片
    imageLoader.get("http://www.people.com.cn/mediafile/pic/20151010/79/16111083488036070527.jpg",imageListener);

设置宽高

   imageLoader.get("http://www.people.com.cn/mediafile/pic/20151010/79/16111083488036070527.jpg",imageListener,300,400);
Volley还有一个图片加载的控件

NetworkImageView使用方法
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单.在布局中使用

<com.android.volley.toolbox.NetworkImageView
    android:id="@+id/networkIv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

步骤

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 在布局文件中添加一个NetworkImageView控件。

  4. 在代码中获取该控件的实例。

  5. 设置要加载的图片地址。

      //创建请求队列
     RequestQueue requestQueue = Volley.newRequestQueue(this);
     //设置默认资源
     mNetworkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
     //设置加载失败的资源
     mNetworkImageView.setErrorImageResId(R.mipmap.ic_launcher);
    
     //创建ImageLoader
     ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
         @Override
         public Bitmap getBitmap(String url) {
    
             return null;
         }
    
         @Override
         public void putBitmap(String url, Bitmap bitmap) {
    
         }
     });
     //设置资源  setImageUrl()方法接收两个参数,第一个参数用于指定图片的URL地址,第二个参数则是前面创建好的ImageLoader对象。
     mNetworkImageView.setImageUrl("http://img0.imgtn.bdimg.com/it/u=560246235,1189337337&fm=21&gp=0.jpg",imageLoader);
    

NetworkImageView中则完全没有提供设置最大宽度和高度的方法
由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终给我们一张大小刚刚好的网络图片

<a name="overview">Overview</a>

MyVolley

        package com.liu.volleydemo.volley;
    
    import android.app.ActivityManager;
    import android.content.Context;
    import android.util.Log;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.ImageLoader;
    import com.android.volley.toolbox.Volley;
    
    /**
     * @Description: 单例
     * @AUTHOR 刘楠  Create By 2016/9/26 0026 15:39
     */
    public class MyVolley {
    
        private static RequestQueue mRequestQueue;
        private static ImageLoader  mImageLoader;
    
        private MyVolley() {
    
        }
        public static RequestQueue getRequestQueue(Context context) {
            if (mRequestQueue == null) {
                init(context);
            }
            return mRequestQueue;
        }
    
        private static void init(Context context) {
    
            mRequestQueue = Volley.newRequestQueue(context);
    
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            //获取内存大小
            int memoryClass = activityManager.getMemoryClass();
            Log.d("vivi", "init: memoryClass"+memoryClass);
            //使用1/8的内存空间来做为缓存
            int maxCacheSize = 1024*1024*memoryClass/8;
    
            Log.d("vivi", "init: maxCacheSize "+maxCacheSize);
    
            //初始化ImageLoad同时初始化自定义的ImageCache
            mImageLoader = new ImageLoader(mRequestQueue,new BitmapLruCache(maxCacheSize));
    
        }
    
        public static ImageLoader getImageLoader() {
            if (mImageLoader != null) {
                return mImageLoader;
            } else {
                throw new IllegalStateException("ImageLoader not initialized");
            }
        }
    }
ImageCache
package com.liu.volleydemo.volley;

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader;

/**
 * @Description: 描述
 * @AUTHOR 刘楠  Create By 2016/9/26 0026 15:34
 */
public class BitmapLruCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {


    public BitmapLruCache(int maxSize) {

        super(maxSize);
    }



    @Override
    protected int sizeOf(String key, Bitmap value) {
        //返回宽度与高度字节乖的结果大小
        return value.getRowBytes() * value.getHeight();
    }

    @Override
    public Bitmap getBitmap(String url) {
        //根据KEY 获取BITMAP
        return get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {

        //保存图片key-url,vaule-bitmap
        put(url,bitmap);
    }
}

感谢郭霖大大
http://blog.csdn.net/guolin_blog/article/details/17482095

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容