初识Volley(四)

main界面视图:


1.JsonRequest   没有有效的json地址,找了google的,400,请替换有效json地址就OK

2.使用的NetWorkImageView

3.使用的ImageRequest


主要说明下ImageRequest,ImageRequest中已经自带了缓存,只需要在代码的地方设置setShouldCache(true);就OK了

通过Volley中的代码,   

public static RequestQueue newRequestQueue(Context context, HttpStack stack) {
        File cacheDir = new File(context.getCacheDir(), “volley”);


可以知道图片缓存在data/data/package/cache/volley下,缓存key直接使用的是URL,

通过代码

RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);

可以知道使用的是DiskBasedCache这个类

可以打开这个类,能发现使用一个Map存储的信息

/** Map of the Key, CacheHeader pairs */
    private final Map<String, CacheHeader> mEntries =
            new LinkedHashMap<String, CacheHeader>(16, .75f, true); 


CacheHeader为DiskBasedCache中的内部类,其实就是一个bean,其中保存了key,length,etag,serverDate等等一系列做缓存是否更新校验的字段


RequestQueue 缓存处理是通过CacheDispatcher做缓存事件分发,同过entry.refreshNeeded()来确定是取缓存还是请求网络。

缓存名字问题: 

private String getFilenameForKey(String key) {
        int firstHalfLength = key.length() / 2;
        String localFilename = String.valueOf(key.substring(0, firstHalfLength).hashCode());
        localFilename += String.valueOf(key.substring(firstHalfLength).hashCode());
        return localFilename;
    }

key代表的是我们下载的url,缓存名字是前半部分名字的hascode拼接后半部分的hascode

关于写入的bean中的数据都是存储在缓存文件中的,

File file = getFileForKey(key);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            CacheHeader e = new CacheHeader(key, entry);
            e.writeHeader(fos);
            fos.write(entry.data);
            fos.close();
            putEntry(key, e);

writeHeader指向-->
ObjectOutputStream oos = new ObjectOutputStream(os);
                oos.writeByte(CACHE_VERSION);
                oos.writeUTF(key);
                oos.writeUTF(etag == null ? "" : etag);
                oos.writeLong(serverDate);
                oos.writeLong(ttl);
                oos.writeLong(softTtl);
                writeStringStringMap(responseHeaders, oos);
                oos.flush();

关于缓存到sdcard中可以这样写(这个是我在其他代码测试的 可能跟这文章中代码关系不大)

//下面注释掉的代码是缓存到sdcard中的
// File sdDir = Environment.getExternalStorageDirectory();//获取跟目录 
// File file = new File(sdDir,"chen");
// DiskBasedCache cache = new DiskBasedCache(file, 20*1024*1024);
// Network network = new BasicNetwork(new HurlStack());
// queue = new RequestQueue(cache, network);
// queue.add(request);
// queue.start();


项目源码地址:http://download.csdn.net/detail/cj6585256/6407947

有人说下载缺少文件,把Volley源文件地址给上:http://download.csdn.net/detail/cj6585256/6407971



无网络时取的缓存图




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值