检查Volley是从缓存还是通过网络获得结果

时间:2013-11-14 08:09:59

标签: android caching android-volley

如何检查Volley是从缓存还是从网络获取JsonObjectRequest的结果?

我需要在需要网络连接时显示进度对话框,而不是在从缓存中快速收到结果时显示。

我的请求看起来像这样

volleyQueue = Volley.newRequestQueue(this);
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>(){...stuff}, new Response.ErrorListener(){...errorstuff});
jr.setShouldCache(true);
volleyQueue.add(jr);

5 个答案:

答案 0 :(得分:11)

我通过覆盖Request#addMarker并检查&#34; cache-hit&#34;来做到这一点。标记被添加:

public class MyRequest<T> extends Request<T> {

    protected boolean cacheHit;

    @Override
    public void addMarker(String tag) {
        super.addMarker(tag);
        cacheHit = false;
        if (tag.equals("cache-hit")){
            cacheHit = true;
        }
    }
}

答案 1 :(得分:4)

在发出请求之前,您可以从请求队列中获取缓存,并检查Entry是否为空。

mRequestQueue.getCache().get("key");

每个请求的密钥通常是URL。 我想你应该检查条目是否已过期。

答案 2 :(得分:2)

Volley有一种内置方式可以通过ImageContainer类来了解 image 请求是否是即时的,但它似乎没有类似于其他请求的机制,例如JSON对象请求。

您似乎有两个主要选择:

  1. 您可以在请求JSON(测试最佳时间)后为300ms设置一个计时器。计时器完成后,检查是否已有结果,否则显示对话框。我知道这有点像“黑客”,但它可能已经足够了。
  2. 编辑Volley代码,为每个请求添加“isImmediate”标志。有多种方法可以实现这一目标。我建议从CacheDispatcher
  3. 开始

答案 3 :(得分:1)

从蒂姆凯利的回答开始。

当你检查“cacheHit”时,它将被恢复为false并且你不会知道它是一个缓存命中,因为在收到“cacheHit”之后和调用“onResponse”之前收到许多其他标记

所以,添加

if(tag.equals("network-http-complete")){
            cacheHit = false;
        }

并删除cacheHit = false;

答案 4 :(得分:0)

adb shell setprop log.tag.Volley VERBOSE

在您的终端中运行此命令,您可能需要设置&#39; adb&#39;在你的路径中,为了使用该命令,它应该位于你的sdk / platform-tools / dir中。

这将提供更详细的排球日志,并将显示执行堆栈的行,以显示缓存命中或未命中的排球请求。