17

如何检查 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);
4

5 回答 5

11

我通过覆盖 Request#addMarker 并检查是否添加了“缓存命中”标记来做到这一点:

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;
        }
    }
}
于 2014-01-09T01:11:06.220 回答
4

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

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

每个请求的键通常是 URL。我想您应该检查条目是否也已过期。

于 2014-01-21T11:55:40.270 回答
2

Volley 有一种内置方法可以通过该类知道图像请求是否是即时的ImageContainer,但是对于诸如 JSON 对象请求之类的其他请求,它似乎没有类似的机制。

您似乎有两个主要选择:

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

从蒂姆凯利的回答开始。

当您检查“cacheHit”时,它会恢复为 false 并且您不会知道这是缓存命中,因为在收到“cacheHit”之后和调用“onResponse”之前收到了许多其他标签。

所以,添加

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

并删除cacheHit = false;

于 2014-04-13T05:56:14.143 回答
1

adb shell setprop log.tag.Volley VERBOSE

在终端中运行此命令,您可能需要在路径中设置“adb”才能使用该命令,它应该位于您的 sdk/platform-tools/ 目录中。

这将提供更详细的 volley 日志,并将显示 volley 请求的执行堆栈行中的某些内容,该请求显示缓存命中或未命中。

于 2014-06-03T14:25:23.283 回答