2016-10-24 13 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

これを実現するには、2つのことを実装する必要があります。

1)Ajaxレスポンスをキャッチしてキャッシュする方法。 2)ajaxリクエストでキャッシュされた結果を提供する方法。

部品番号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; 
    } 
+0

オハイオ州いいね....私は今日後でそれを試してみましょう、それがあなたが報われる:)#1 "PSのソリューションはどのようにajax呼び出しを行うからですアプリがWebviewにあり、開始時と終了時にフィードバックを受け取ることができます。「Part#2」ソリューションは正解のように聞こえるので、コードから引用符を投稿して完全な回答になります。 –

+1

すぐに期限が切れると私はあなたに恩恵を与えるので、私は完全な解決策を投稿する穴の事を完了します –