Volley更改缓存目录

来源:互联网 发布:园林景观设计软件 编辑:程序博客网 时间:2024/05/19 22:50

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.widget.ImageView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.csxz.snowflack.rotla.BuildConfig;

import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;


public class VolleyUtils {
    public static RequestQueue mQueue;
    public static ImageLoader mLoader;
    private static LruCache<String, Bitmap> lruCache;// 强引用缓存,一级缓存,特点:使用最近最少使用算法,将旧数据移除,为新数据提供空间
    private static Map<String, SoftReference<Bitmap>> softCache;// 软引用缓存,二级缓存
    public static RequestQueue getQueue(Context context) {
        if (mQueue == null) {
            mQueue = Volley.newRequestQueue(context);
        }
        return mQueue;
    }

    /**
     * 解析数据的接口
     *
     * @author blueZhang
     *
     * @param <T>
     */
    public interface MyParser<T> {
         void getJson(String response);
    }

    /**
     * 将数据下载后,再进行解析,在Parser接口中写解析的方法
     *
     * @param url
     *            下载文本的url地址
     * @param context
     *            上下文
     * @param parser
     *            解析数据的接口
     */
    public static <T> void getJsonString(String url, final Context context,final MyParser<T> parser)
    {
        StringRequest request = new StringRequest(url, new Listener<String>() {
            public void onResponse(String response) {
                parser.getJson(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (BuildConfig.DEBUG) Log.d("getJsonString error!", error.getMessage());
            }
        });
        getQueue(context).add(request);
    }

    /**
     * 根据网址将图片加载到布局上面去<br/>
     * 含有加载中的图片和出错的id
     * @param context
     *            上下文
     * @param path
     *            图片网址
     * @param imageview
     *            要设置图片的ImageView对象
     * @param defaultImageResId
     *            默认图片
     * @param errorImageResId
     *            出现错误后显示在ImageView上的图片
     */
    public static void setImage(Context context, String path,ImageView imageview, int defaultImageResId, int errorImageResId)
    {
        setImage(context,path,imageview,defaultImageResId,errorImageResId,0,0);
    }



    /**
     * 根据网址将图片加载到布局上面去<br/>
     * 没有预加载图片和Error的图片
     *
     *
     * @param context
     *            上下文
     * @param path
     *            图片网址
     * @param imageview
     *            要设置图片的ImageView对象
     */
    public static void setImage(Context context, String path,ImageView imageview)
    {
        setImage(context, path, imageview, 0, 0);
    }

    /**
     * 根据网址将图片加载到布局上面去<br/>
     * 只有加载中的图片没有错误图片
     * @param context
     *            上下文
     * @param path
     *            图片网址
     * @param imageview
     *            要设置图片的ImageView对象
     * @param defaultImageResId
     *            默认图片
     */
    public static void setImage(Context context, String path,ImageView imageview, int defaultImageResId)
    {
        setImage(context,path,imageview,defaultImageResId,0);
    }



    /**
     * 根据网址将图片加载到布局上面去
     *
     * @param context
     *            上下文
     * @param path
     *            图片网址
     * @param imageview
     *            要设置图片的ImageView对象
     * @param defaultImageResId
     *            默认图片
     * @param errorImageResId
     *            出现错误后显示在ImageView上的图片
     * @param MAX_HEIGHT
     *              最大高度
     * @param MAX_WIDTH
     *             最大宽度
     */
    public static void setImage(Context context, String path,ImageView imageview, int defaultImageResId, int errorImageResId,int MAX_WIDTH,int MAX_HEIGHT)
    {
        ImageLoader imgLoader = getLoader(context);
        imgLoader.get(path, ImageLoader.getImageListener(imageview,
                defaultImageResId, errorImageResId),MAX_WIDTH,MAX_HEIGHT);
    }

    public static ImageLoader getLoader(Context context) {
        if (mLoader == null) {
            // 实例化二级缓存
            softCache = new HashMap<String, SoftReference<Bitmap>>();

            // 实例化一级缓存
            lruCache = new LruCache<String, Bitmap>(2 * 1024 * 1024) {// 缓存的内存空间为2M
                protected int sizeOf(String key, Bitmap value) {
                    // 计算存放成员的大小,返回字节大小
                    return value.getRowBytes() * value.getHeight();// 图片大小
                }

                @Override
                protected void entryRemoved(boolean evicted, String key,Bitmap oldValue, Bitmap newValue) {
                    // 移除旧成员
                    if (evicted)
                    {
                        // 将移除的成员存放到二级缓存中
                        softCache.put(key, new SoftReference<Bitmap>(oldValue));// 将移除的成员存放到二级缓存中
                    }

                    super.entryRemoved(evicted, key, oldValue, newValue);
                }

            };

            // 实例化图片加载器
            mLoader = new ImageLoader(getQueue(context),
                    new ImageLoader.ImageCache() {

                        public void putBitmap(String url, Bitmap bitmap) {
                            // 将图片存放在缓存中的方法
                            // 将图片存放在一级缓存中
                            lruCache.put(url, bitmap);
                            // 将图片也存放在扩展卡
                            try {
                                ImageUtils.saveImg(url, bitmap);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }

                        public Bitmap getBitmap(String url) {
                            // 从缓存中读取图片的方法
                            // 先从一级缓存中获取
                            Bitmap b = lruCache.get(url);
                            if (b == null) {
                                // 从二级缓存中读取
                                SoftReference<Bitmap> reference = softCache
                                        .get(url);
                                if (reference != null) {// 二级缓存中如果存在
                                    b = reference.get();
                                    if (b != null) {
                                        // 将图片对象存放到一级缓存中
                                        lruCache.put(url, b);
                                        // 从二级缓存中移除
                                        softCache.remove(reference);
                                    } else {// 从三级缓存中读取--扩展卡
                                        b = ImageUtils.getImg(url);
                                        if (b != null) {
                                            // 将图片存放到一级缓存中
                                            lruCache.put(url, b);
                                        }
                                    }
                                }

                            }
                            return b;
                        }
                    });

        }
        return mLoader;
    }
}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递没收到货要退款怎么办 发票给了不给钱怎么办 付款后不给发票怎么办 供货商不给发票怎么办 刚生过孩子太胖买衣服怎么办 黑色牛仔裤洗的发白怎么办 蘑菇街手机丢了怎么办 黑衣服上全是白毛毛怎么办 支付宝注销了钱怎么办 网上买东西手机号写错了怎么办 二类工资卡过万怎么办 淘宝发货地址写错怎么办 淘宝发货地址写错了怎么办 淘宝不能代付了怎么办 支付宝付款码被盗刷怎么办 地方选举追究不到相关责任人怎么办 天正建筑画个直线找不到怎么办 Wi-Fi模块不支持多播怎么办? 魅族手机屏幕点不动怎么办 uc打开网页很慢怎么办 京东手机号码无法登录怎么办 织梦系统网站没收录怎么办 电脑开机出现一堆乱码怎么办 电脑文件夹出现乱码打不开怎么办 电脑出现f1和f2怎么办 电脑中韩文内容显示乱码怎么办 入驻shopee没身份证怎么办 液相色谱柱柱压降低怎么办 c18色谱柱堵了怎么办 色谱柱进空气了怎么办 宫颈评分只有3分怎么办 淘宝鞋子售后退货商家拒收怎么办 退货申通cp原因怎么办 运费险赔的少怎么办 淘宝卖游戏账号恶意退款怎么办 淘宝账号体检虚拟违规怎么办 京东虚拟单被骗怎么办 网络公选课挂科怎么办 淘宝评论被商家关闭怎么办? 皇冠车钥匙丢了怎么办 皇冠行李箱钥匙丢了怎么办