当前位置: 首页 > 知识库问答 >
问题:

Volley-JSON缓存工作不正常

充培
2023-03-14

服务器向我发送json对象、过期和ETAG。我希望Voley将这个对象保存在缓存中,并在下一次请求该对象时使用对服务器的请求,包括在报头中的ETag。如果响应将是304不修改,那么它应该使用缓存的资源,如果它将是200OK,它应该使用来自服务器的新资源。

Volley根本不发送请求(如果缓存未过期),或者如果缓存过期,则发送带有If-None-Match+etag字符串的新请求。并且服务器总是以200响应

共有1个答案

施弘壮
2023-03-14

如果Volley检测到缓存条目尚未过期,它将不会向服务器发出请求。下面是一些代码摘录来证明:

// If it is completely expired, just send it to the network.
if (entry.isExpired()) {
    request.addMarker("cache-hit-expired");
    request.setCacheEntry(entry);
    mNetworkQueue.put(request);
    continue;
}

和:

if (!entry.refreshNeeded()) {
    // Completely unexpired cache hit. Just deliver the response.
    mDelivery.postResponse(request, response);
} else {
    // Soft-expired cache hit. We can deliver the cached response,
    // but we need to also send the request to the network for
    // refreshing.
    request.addMarker("cache-hit-refresh-needed");
    request.setCacheEntry(entry);

    // Mark the response as intermediate.
    response.intermediate = true;

    // Post the intermediate response back to the user and have
    // the delivery then forward the request along to the network.
    mDelivery.postResponse(request, response, new Runnable() {
        @Override
        public void run() {
            try {
                mNetworkQueue.put(request);
            } catch (InterruptedException e) {
                // Not much we can do about this.
            }
        }
    });
}

您可能希望通过在cache-controlexpires头设置max-age控制服务器上的资源过期,以便调整客户端上的缓存。

 类似资料:
  • 在我的Android应用程序中,我使用Volley在自定义列表视图中加载图像。 当我多次刷新(删除所有项目并加载tiems)listview时,我的应用程序就会被这条消息杀死 我该怎么修好它?

  • 在我的项目中,我使用了一个@Cacheable注释ia一个服务方法,它返回涉及书籍和一些标记的计算结果,我想在一个@Controller类方法中退出缓存,该方法将一本新书添加到数据库中,因为这本新书将是新计算所必需的。 服务类:@Cacheable("metas") 控制器类:@RequestMapping@CacheEvict(value=“metas”,allEntries=true)

  • 我想要什么?使用缓存和度量 为什么? 更快的响应 一些度量数据可以用来评估以下内容:总点击率、平均持续时间、最小持续时间、最大持续时间。。。等等 我试过: 和 应用这两种方法: 两者都按预期工作(第一次通话)...甜蜜! 问题是,因为缓存只在第一次调用时运行该方法,后续调用直接通过缓存处理,并且不再记录度量。 我知道quarkus缓存扩展仍在预览中。据我所知,微文件与缓存无关。 是的。。。 “千分

  • 我使用的是springboot 2.1.1。我使用@Enable缓存启用了缓存 CacheManager已创建并可以注入到我的类中。 一旦我添加了一个库https://github.com/MarcGiffing/bucket4j-spring-boot-starter启动应用程序时出错: 经过大量调试,我无法找到库破坏CacheManager的原因和方式。 似乎没有使用CacheAutoConf

  • 我想将主数据缓存到Redis。 所以,我写了这些代码。 和 和ymlfile 但是,缓存不工作... 无论何时调用printTest方法,都将执行“getTest”方法。Redis没有数据。。。我的代码中有什么问题? SpringBoot版本是1.4.0 依赖关系是

  • 我正在使用Android截击来发出请求。所以我使用这个代码。我不明白一件事。我在服务器中检查params是否始终为null。我认为GETPARAMS()不工作。我应该做些什么来解决这个问题。