为了实现这一点,你必须实现两件事情。
1)捕捉Ajax响应并缓存它的方法。 2)一种在ajax请求上提供缓存结果的方法。
Part#1 您可以使用JavascriptInterface和jQuery来捕捉AJAX响应。有关如何使用JavascriptInterface的示例,请看here。之后,您可以缓存响应
零件号2(或1 & 2) 您可以使用WebViewClient的shouldInterceptRequest方法提供缓存的内容。以here为例。在该示例中,您可以组合#part 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;
}
哦不错....听起来像它会工作今天晚些时候我会尝试它,如果它的作品,你会得到回报:) PS的“第1号”的解决方案是如何从Ajax调用应用程序在webview中,并在开始和结束时收到反馈...“Part#2”解决方案听起来像是正确的答案,因此您可以从代码中发布引号以获得完整答案,谢谢 –
我几乎将它工作,所以我给你的赏金,因为它会很快到期,一旦我完成了洞的事情,我会发布完整的解决方案 –