我正在尝试使用Retrofit和OKHttp来缓存HTTP响应.我按照这个要点,结束了这段代码:
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
HttpResponseCache httpResponseCache = null;
try {
httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
Log.e("Retrofit", "Could not create http cache", e);
}
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setResponseCache(httpResponseCache);
api = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(okHttpClient))
.build()
.create(MyApi.class);
Run Code Online (Sandbox Code Playgroud)
这是带有Cache-Control标头的MyApi
public interface MyApi {
@Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=2419200")
@GET("/api/v1/person/1/")
void requestPerson(
Callback<Person> callback
);
Run Code Online (Sandbox Code Playgroud)
首先,我在线请求并检查缓存文件.有正确的JSON响应和标题.但是当我尝试离线请求时,我总是得到RetrofitError UnknownHostException.我还有什么办法让Retrofit从缓存中读取响应吗?
编辑:
因为OKHttp 2.0.x HttpResponseCache是Cache …
我目前使用一个缓存清单(如描述在这里).这有效地使得在用户离线时运行应用程序所需的资源.
不幸的是,它运作得有点好.
加载缓存清单后,Firefox 3.5+将缓存缓存清单中显式引用的所有资源.但是,如果服务器上的文件已更新,并且用户尝试在线时强制刷新页面(包括缓存清单本身),Firefox将绝对拒绝提取任何内容.应用程序在缓存的最后一点保持完全冻结.问题:
我读取服务工作者的离线缓存类似于浏览器缓存.那么为什么更喜欢服务工作者进行这种缓存.甚至浏览器缓存也会检查是否修改了文件,然后从缓存中提供服务,而服务工作者则从我们的代码中处理相同的事情.但默认情况下浏览器具有该功能,为什么更喜欢服务工作者?
有没有办法在使用Google Maps API的Android应用中使用离线模式?
教程或源代码的任何方向都将是一个巨大的帮助.我一直在寻找几个小时没有运气.我知道Google已经发布了一种离线使用地图的方法,但它是否适用于Android开发者?
我正在考虑使用firebase来编写使用PhoneGap和HTML5应用程序缓存的移动应用程序.
让我们假设每个用户都有一个TODO项目列表.如果在手机离线时启动应用程序,它是否能够从上一个会话加载数据并在建立连接时同步?如果是这样,我想知道这是如何实现的,因为我在firebase.js中找不到对localStorage的引用.
我一直在做很多工作,让一些网络应用程序在iOS上使用HTML5清单脱机工作.我遇到了其他人都遇到的典型问题并修复了它们,一切似乎都运行良好 - 除非我将iPhone应用程序保存到iPhone 4桌面上.
如果我执行此操作然后启用飞行模式,则在尝试通过主屏幕访问应用程序时会收到以下警告:"由于未连接到互联网,因此无法打开您的应用程序名称." 通过Safari浏览器访问应用程序在离线时工作正常.
如果有人知道这是我的错误,甚至是解决问题的可能性,请告诉我们.
即使下载新的金融时报网络应用程序(在广泛的localStorage支持下做得非常好)也会在从主屏幕离线访问时导致错误.
技术规格:使用iOS 4.3.3运行iPhone 4(但也见过4.3.2中的问题)
我有一个带有相关appcache清单的HTML文档.但现在我想摆脱离线应用程序缓存一段时间.
如果我从<html>标记中删除提示清单,那么已经拥有缓存版本的浏览器将继续使用该缓存版本.
如果我更新appcache清单,那么,无论如何,仍然有一个appcache.
删除脱机应用程序缓存的最明智的方法是什么?我想我可以更改清单,除了以下内容之外没有其他条目:
NETWORK:
*
Run Code Online (Sandbox Code Playgroud)
然后它实际上不会缓存任何东西.
但肯定有一种方法可以完全摆脱appcache和清单文件,不是吗?
html5 offline-caching manifest.cache cache-manifest html5-appcache
我有以下内容:
var express = require('express'),
app = express.createServer();
app.get("/offline.manifest", function(req, res){
res.contentType("text/cache-manifest");
res.end("CACHE MANIFEST");
});
app.listen(8561);
Run Code Online (Sandbox Code Playgroud)
Chrome中的网络标签显示它是text/plain.为什么不设置标题?
上面的代码有效,我的问题是由链接到旧版本的express-js引起的
真的很快就要讨论了,因为我想得到不同人的意见.
我正在开发一个必须离线可用的网页应用程序.
现在要做到这一点,据我所知,您将使用应用程序缓存功能或使用服务工作者.
但是,这是我的难题.在研究应用程序缓存时,MDN明确指出:
不推荐使用:
此功能已从Web标准中删除.虽然有些浏览器可能仍然支持它,但它正在被删除.不要在旧项目或新项目中使用它.使用它的页面或Web应用程序可能随时中断.
之后,另一个对话框建议使用服务工作者.
然后,Service Workers页面继续说明Service Workers是一种实验性技术,最好参考兼容性表.
兼容性表说Safari和Internet Explorer不支持Service Workers.进一步咨询该网站,并假设它是准确的,它表示微软已经开始整合服务工作者的工作,但对于Safari,他们"正在考虑""五年计划中的短暂积极信号".
现在这是当前项目的一个问题,因为它必须与Safari兼容,但是,我也不希望它在其他浏览器中破解.
你的建议是什么?只需使用较旧的应用程序缓存并在不久的将来更新?确定用户浏览器并采取适当的行动?或者,我还有另一种方法吗?
html5 application-cache offline-caching offlineapps service-worker
我在应用程序中使用的文件夹中有很多图像.当使用缓存清单时,如果我可以指定一个通配符来加载要缓存的特定目录中的所有图像或文件,则更容易维护.
例如
CACHE MANIFEST
# 2011-11-3-v0.1.8
#--------------------------------
# Pages
#--------------------------------
../index.html
../edit.html
#--------------------------------
# JavaScript
#--------------------------------
../js/jquery.js
../js/main.js
#--------------------------------
# Images
#--------------------------------
../img/*.png
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?在一些浏览器中尝试过它,../img/*但它似乎不起作用.
offline-caching ×10
html5 ×5
caching ×3
offlineapps ×3
android ×1
express ×1
firebase ×1
firefox ×1
google-maps ×1
html ×1
http-headers ×1
ios ×1
java ×1
javascript ×1
manifest ×1
node.js ×1
offline ×1
okhttp ×1
retrofit ×1