当前主流的APP已放弃了图片的三级缓存,直接使用“网络缓存+内存缓存”减少空间浪费,加快程序运行效率,这种方式的组合很适合使用Volley的NetworkImageView + LruCache的方式。即用Volley实现网络缓存 ,用LruCache 实现内存缓存。
由于是在GridView或者ListView中,所以代码实现在适配中最为方便。
1 布局
GridView布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
 >
    <GridView
        android:id="@+id/gv_Content"
        android:numColumns="3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:stretchMode="columnWidth"
        android:gravity="center"/>
</LinearLayout>
NetworkImageView 的XML文件布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.android.volley.toolbox.NetworkImageView
        android:layout_gravity="center"
        android:id="@+id/iv_ItemContent"
        android:layout_width="90dp"
        android:layout_height="90dp" 
        android:src="@mipmap/ic_launcher"/>
</LinearLayout>2 初始化:
网络缓存,内存缓存初始化:
private ImageLoader imageLoader;
private void InitNetCache_MemeroyCache() {
        // volley 网络添加新的图片
        /*************************************************************
         * 内存缓存初始化 开始
         ***********************************************************/
        // 为程序添加图片缓存,并设置缓存大小
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;
        final LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                System.out.println(".................................sizeOf :" + value.getByteCount());
                return value.getByteCount(); // 获取图片大小
            }
        };
        /**
         * 每一次setImageUrl时加载新图片都会先执行getBitmap,看在缓存中是否存在,如果不存在,则执行putmap获取bitmap对象
         */
        ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() {
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                System.out.println("imageCache : putBitmap()");
                mMemoryCache.put(url, bitmap);
            }
            @Override
            public Bitmap getBitmap(String url) {
                System.out.println("imageCache : getBitmap()");
                return mMemoryCache.get(url);
            }
        };
        /*************************************************************
         *  内存缓存初始化 结束
         ***********************************************************/
        /****************************************************
         * 网络缓存初始化 开始
         ***************************************************/
        RequestQueue requestQueue = Volley.newRequestQueue(mContext);
        imageLoader = new ImageLoader(requestQueue, imageCache);
        /**************************************************
         * 网络缓存初始化 结束
         **************************************************/
    }3 应用
由于NetworkImageView加载图片使用url作为区分不同图片的参数,直接传入URL即可。
在getView函数中为Networkimageview 设置网络图片:
private void setImageView(String imageUrl, NetworkImageView imageView) {
        imageView.setImageUrl(imageUrl, imageLoader);
    }NOTE:
这样就很简单的实现了网络缓存以及内存缓存的功能,由于Volley已经完全实现了HttpURLConnection 以及HttpClient,所以不需要对底层进一步封装,也不需要对应用层HTTP协议进行包拼接,OKHttp在Android4.4中也被应用到Volley,非常方便使用。
在另一篇博客中使用了三级缓存,对于需要本地缓存的应用场景,可使用HttpUrlConnection,相对方便控制加载过程。http://blog.csdn.net/xiaoleiacmer/article/details/50482863
与Volley相关的两旁给力博客:
http://blog.csdn.net/guolin_blog/article/details/17482095
http://blog.csdn.net/guolin_blog/article/details/17482165
本例代码:http://download.csdn.net/detail/xiaoleiacm/9510951
package com.example.admin.gridviewwall.Adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.GridView;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
import com.example.admin.gridviewwall.R;
/**
 * Created by admin on 2016/5/4.
 */
public class PhotoWallAdapter4 extends ArrayAdapter<String> implements AbsListView.OnScrollListener {
    private GridView mPhotoWall;
    private Context mContext;
    private ImageLoader imageLoader;
    private int mfirstVisbleItem;
    private int mvisibleItemCount;
    public PhotoWallAdapter4(Context context, int resource) {
        super(context, resource);
    }
    public PhotoWallAdapter4(Context context, int resource, int textViewResourceId, String[] objects, GridView gridview) {
        super(context, resource, textViewResourceId, objects);
        mContext = getContext();
        mPhotoWall = gridview;
        mPhotoWall.setOnScrollListener(this);
        InitNetCache_MemeroyCache();
    }
    private void InitNetCache_MemeroyCache() {
        // volley 网络添加新的图片
        /*************************************************************
         * 内存缓存初始化 开始
         ***********************************************************/
        // 为程序添加图片缓存,并设置缓存大小
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 8;
        final LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                System.out.println(".................................sizeOf :" + value.getByteCount());
                return value.getByteCount(); // 获取图片大小
            }
        };
        /**
         * 每一次setImageUrl时加载新图片都会先执行getBitmap,看在缓存中是否存在,如果不存在,则执行putmap获取bitmap对象
         */
        ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() {
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                System.out.println("imageCache : putBitmap()");
                mMemoryCache.put(url, bitmap);
            }
            @Override
            public Bitmap getBitmap(String url) {
                System.out.println("imageCache : getBitmap()");
                return mMemoryCache.get(url);
            }
        };
        /*************************************************************
         *  内存缓存初始化 结束
         ***********************************************************/
        /****************************************************
         * 网络缓存初始化 开始
         ***************************************************/
        RequestQueue requestQueue = Volley.newRequestQueue(mContext);
        imageLoader = new ImageLoader(requestQueue, imageCache);
        /**************************************************
         * 网络缓存初始化 结束
         **************************************************/
    }
    /*****************
     * GridView 开始
     ****************************************************************/
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String imageUrl = getItem(position);
//        System.out.println("Url : " + imageUrl);
        View view;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(R.layout.item_gridview, null);
        } else {
            view = convertView;
        }
        //使用Volley下载网络图片
        NetworkImageView photo = (NetworkImageView) view.findViewById(R.id.iv_ItemContent);
        photo.setTag(imageUrl);
        setImageView(imageUrl, photo);
        return view;
    }
    private void setImageView(String imageUrl, NetworkImageView imageView) {
        imageView.setImageUrl(imageUrl, imageLoader);
    }
    /*****************
     * GridView 结束
     ****************************************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /***********************
     * 滚动状态指示 开始
     * ************************************************************************/
    /**
     * 滚动状态指示函数
     *
     * @param view
     * @param scrollState
     */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
//        for (int i = mfirstVisbleItem; i < mfirstVisbleItem + mvisibleItemCount; i++) {
//            String url = getItem(i);
//            NetworkImageView networkimageviewbytag = (NetworkImageView) mPhotoWall.findViewWithTag(url);
//
//            networkimageviewbytag.setImageUrl(url, imageLoader);
//
//        }
    }
    /**
     * 滚动指示函数
     *
     * @param view
     * @param firstVisibleItem
     * @param visibleItemCount
     * @param totalItemCount
     */
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        mfirstVisbleItem = firstVisibleItem;
        mvisibleItemCount = visibleItemCount;
//        for (int i = firstVisibleItem; i < firstVisibleItem + visibleItemCount; i++) {
//            String url = getItem(i);
//            NetworkImageView networkimageviewbytag = (NetworkImageView) mPhotoWall.findViewWithTag(url);
//
//            networkimageviewbytag.setImageUrl(url, imageLoader);
//
//        }
    }
    /*************************
     * 滚动状态指示 结束
     **********************************************************************/
}
 
                   
                   
                   
                   
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   4475
					4475
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            