美文网首页Android开发技术Android开发程序员
使用Volley加载、缓存图片(ImageLoader)

使用Volley加载、缓存图片(ImageLoader)

作者: 食梦兽 | 来源:发表于2015-10-30 20:49 被阅读5249次

    关键字:图片缓存 LruCache ImageCache NetworkImageView ImageRequest ImageLoader

    前言上篇笔记 记录了Volley的简单用法,进行简单的GET、POST请求。这篇文章将记录Volley加载、缓存图片的用法。

    Volley还可以进行图片的加载和缓存,可以利用ImageRequest对象简单、方便地进行网络图片的获取。ImageLoader用于获取或缓存图片。NetworkImageView是Volley提供的一个自定义View,可直接设置网络图片。

    1. 使用ImageRequest简单地进行网络图片的获取

    String url = "https://images.unsplash.com/photo-1445251836269-d158eaa028a6?fit=crop&fm=jpg&h=625&ixlib=rb-0.3.5&q=80&w=1375";
    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    //构建ImageRequest 实例
    ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {    
          @Override    
          public void onResponse(Bitmap response) {  
              //给imageView设置图片      
              myImageView.setImageBitmap(response);    
          }
    }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, new Response.ErrorListener() {    
          @Override    
          public void onErrorResponse(VolleyError error) { 
              //设置一张错误的图片,临时用ic_launcher代替          
              myImageView.setImageResource(R.drawable.ic_launcher);    
          }
    }); 
    
    requestQueue.add(request);
    

    注意:在构建ImageRequest实例时,需要传递七个参数(六个参数的重载方法已过时,少一个ScaleType参数)
    这七个参数类型分别为:

    1. String : 要获取的图片地址
    2. Response.Listener<Bitmap> : 获取图片成功的回调
    3. intmaxWidth,获取图片的最大宽度,会自动进行压缩或拉伸,设置为0,即获取原图
    4. intmaxHeight,同上
    5. ScaleType :显示的类型,居中,平铺等
    6. Config:图片类型,如:Bitmap.Config.RGB_565
    7. Response.ErrorListener: 获取图片失败的回调

    2. 使用ImageLoader缓存网络图片

    使用ImageLoader只需三步:

    1. 实例化ImageLoader
    2. 设置监听器
    3. 获取图片

    代码如下:
    MainActivity.java文件:

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    //1.实例化ImageLoader
    ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
    //2.设置监听器
    ImageLoader.ImageListener listener = 
             ImageLoader.getImageListener(myImageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
    //3.获取图片
    loader.get(url, listener);
    

    BitmapCache.java文件:

    public class BitmapCache implements ImageLoader.ImageCache {    
       //LruCache对象    
       private LruCache<String, Bitmap> lruCache ;    
       //设置最大缓存为10Mb,大于这个值会启动自动回收    
       private int max = 10*1024*1024;    
       
       public BitmapCache(){       
          //初始化 LruCache
          lruCache = new LruCache<String, Bitmap>(max){            
          @Override            
          protected int sizeOf(String key, Bitmap value) {                
             return value.getRowBytes()*value.getHeight();            
          }        
         };    
       }   
       @Override    
       public Bitmap getBitmap(String url) {        
          return lruCache.get(url);    
       }    
       @Override    
       public void putBitmap(String url, Bitmap bitmap) {          
          lruCache.put(url, bitmap);    
       }
    }
    

    说明:

    1. ImageLoader构造器需要两个参数,requestQueue是熟悉的请求队列,imageCache是图片缓存对象,需要自定义类实现imageCache对象。使用LruCache来作为具体的图片缓存对象。
    2. ImageLoader.getImageListener()需要三个参数:ImageView实例,默认的图片资源,错误显示的图片资源
    3. ImageLoader调用get(ImageURL, listener)方法,获取图片

    3. NetworkImageView的使用

    layout_main.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
          android:layout_width="match_parent"    
          android:layout_height="match_parent"    
          android:padding="@dimen/activity_horizontal_margin"    >    
       <Button        
          android:id="@+id/button"        
          android:layout_width="wrap_content"        
          android:layout_height="wrap_content"        
          android:onClick="click"        
          android:text="获取图片"        
          android:layout_alignParentTop="true"        
          android:layout_centerHorizontal="true" />    
       <com.android.volley.toolbox.NetworkImageView        
          android:id="@+id/mNetworkImageView"        
          android:layout_width="wrap_content"        
          android:layout_height="wrap_content"        
          android:layout_centerVertical="true"        
          android:layout_centerHorizontal="true" />
    </RelativeLayout>
    

    BitmapCache.java文件:同“使用ImageLoader缓存网络图片”。

    MainActivity.java文件:

    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    //实例化ImageLoader
    ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
    //设置默认图片
    mNetworkImageView.setDefaultImageResId(R.drawable.ic_launcher);
    //设置错误图片
    mNetworkImageView.setErrorImageResId(R.drawable.ic_launcher);
    //设置图片url和ImageLoader
    mNetworkImageView.setImageUrl(url,loader);
    

    相关文章

      网友评论

      本文标题:使用Volley加载、缓存图片(ImageLoader)

      本文链接:https://www.haomeiwen.com/subject/sxmfhttx.html