初识Volley(四)

来源:互联网 发布:知乎 墨子号 编辑:程序博客网 时间:2024/06/14 02:28

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



无网络时取的缓存图




原创粉丝点击