初识Volley(四)

main界面视图:

初识Volley(四)_第1张图片

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 mEntries =
            new LinkedHashMap(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


初识Volley(四)_第2张图片

无网络时取的缓存图




你可能感兴趣的:(android,Volley)