Android WebView缓存用于脱机的AJAX响应
有没有办法缓存在WebView中接收到的AJAX响应以供脱机使用 我使用一些webveiw设置和最重要的设置缓存了页面及其所有资源:Android WebView缓存用于脱机的AJAX响应,android,ajax,caching,webview,Android,Ajax,Caching,Webview,有没有办法缓存在WebView中接收到的AJAX响应以供脱机使用 我使用一些webveiw设置和最重要的设置缓存了页面及其所有资源: ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Activity.CONNECTIVITY_SERVICE); if (cm.getActiveNetworkInfo() == null || !cm.getActiveNetwork
ConnectivityManager cm = (ConnectivityManager) getActivity().getSystemService(Activity.CONNECTIVITY_SERVICE);
if (cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected()) {
wvContent.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
} else {
wvContent.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
}
但在我缓存的客户机页面中,有一些AJAX调用,我希望将这些响应联合缓存以供脱机使用?有没有办法做到这一点?为了做到这一点,你必须实现两件事 1) 捕获Ajax响应并缓存它的一种方法。 2) 为ajax请求提供缓存结果的一种方法 第1部分 您可以使用JavascriptInterface和jQuery捕获AJAX响应。查看如何使用JavascriptInterface的示例。之后,您可以缓存响应 第2部分(或第1和第2部分) 您可以使用WebViewClient的shouldInterceptRequest方法提供缓存内容。请看一个例子。在本例中,您可以结合#第1部分并进行网络调用以手动获取Ajax响应 下面是一个您可以使用的示例
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
Log.i(TAG,"shouldInterceptRequest path:"+request.getUrl().getPath());
WebResourceResponse returnResponse = null;
if (request.getUrl().getPath().startsWith("/cart")) { // only interested in /cart requests
returnResponse = super.shouldInterceptRequest(view, request);
Log.i(TAG,"cart AJAX call - doing okRequest");
Request okRequest = new Request.Builder()
.url(request.getUrl().toString())
.post(null)
.build();
try {
Response okResponse = app.getOkHttpClient().newCall(okRequest).execute();
if (okResponse!=null) {
int statusCode = okResponse.code();
String encoding = "UTF-8";
String mimeType = "application/json";
String reasonPhrase = "OK";
Map<String,String> responseHeaders = new HashMap<String,String>();
if (okResponse.headers()!=null) {
if (okResponse.headers().size()>0) {
for (int i = 0; i < okResponse.headers().size(); i++) {
String key = okResponse.headers().name(i);
String value = okResponse.headers().value(i);
responseHeaders.put(key, value);
if (key.toLowerCase().contains("x-cart-itemcount")) {
Log.i(TAG,"setting cart item count");
app.setCartItemsCount(Integer.parseInt(value));
}
}
}
}
InputStream data = new ByteArrayInputStream(okResponse.body().string().getBytes(StandardCharsets.UTF_8));
Log.i(TAG, "okResponse code:" + okResponse.code());
returnResponse = new WebResourceResponse(mimeType,encoding,statusCode,reasonPhrase,responseHeaders,data);
} else {
Log.w(TAG,"okResponse fail");
}
} catch (IOException e) {
e.printStackTrace();
}
}
return returnResponse;
}
@TargetApi(Build.VERSION\u CODES.LOLLIPOP)
@凌驾
公共WebResourceResponse应InterceptRequest(WebView视图、WebResourceRequest请求){
Log.i(标记“shouldInterceptRequestPath:+request.getUrl().getPath());
WebResourceResponse returnResponse=null;
如果(request.getUrl().getPath().startsWith(“/cart”){//只对/cart请求感兴趣
returnResponse=super.shouldInterceptRequest(视图、请求);
i(标记为“cart AJAX调用-doing okRequest”);
请求okRequest=newrequest.Builder()
.url(request.getUrl().toString())
.post(空)
.build();
试一试{
Response-okResponse=app.getOkHttpClient().newCall(okRequest.execute();
if(okResponse!=null){
int statusCode=okResponse.code();
字符串编码=“UTF-8”;
字符串mimeType=“application/json”;
String reasonPhrase=“OK”;
Map responseHeaders=newhashmap();
if(okResponse.headers()!=null){
if(okResponse.headers().size()>0){
对于(int i=0;i
哦,太好了。。。。听起来它会起作用,我今天晚些时候会试试,如果它起作用,你会得到奖励:)PS“Part#1”解决方案是如何在webview中从应用程序发出ajax调用,并在启动和结束时接收反馈。。。“Part#2”解决方案听起来像是正确的答案,因此您可以将代码中的引用发布为完整答案感谢我几乎成功了,所以我给您奖金,因为它将很快过期,一旦我完成洞的事情,我将发布完整的解决方案