2016-10-24 65 views
3

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

我已缓存的页面,并使用一些webveiw设置最importnant其所有资源:

 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

为了实现这一点,你必须实现两件事情。

1)捕捉Ajax响应并缓存它的方法。 2)一种在ajax请求上提供缓存结果的方法。

Part#1 您可以使用JavascriptInterface和jQuery来捕捉AJAX响应。有关如何使用JavascriptInterface的示例,请看here。之后,您可以缓存响应

零件号2(或1 & 2) 您可以使用WebViewClient的shouldInterceptRequest方法提供缓存的内容。以here为例。在该示例中,您可以组合#pa​​rt 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; 
    } 
+0

哦不错....听起来像它会工作今天晚些时候我会尝试它,如果它的作品,你会得到回报:) PS的“第1号”的解决方案是如何从Ajax调用应用程序在webview中,并在开始和结束时收到反馈...“Part#2”解决方案听起来像是正确的答案,因此您可以从代码中发布引号以获得完整答案,谢谢 –

+1

我几乎将它工作,所以我给你的赏金,因为它会很快到期,一旦我完成了洞的事情,我会发布完整的解决方案 –