Android WebView缓存用于脱机的AJAX响应

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

有没有办法缓存在WebView中接收到的AJAX响应以供脱机使用

我使用一些webveiw设置和最重要的设置缓存了页面及其所有资源:

        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”解决方案听起来像是正确的答案,因此您可以将代码中的引用发布为完整答案感谢我几乎成功了,所以我给您奖金,因为它将很快过期,一旦我完成洞的事情,我将发布完整的解决方案