2016-10-24 5 views
3

Gibt es eine Möglichkeit, die AJAX-Antworten zwischenzuspeichern, die im WebView für die Offline-Verwendung zwischengespeichert werden?Android WebView-Cache AJAX-Antwort für Offline

Ich habe die Seite zwischengespeichert und alle seine Ressourcen einige der webveiw Einstellungen und die meisten importnant mit:

 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); 
    } 

Aber in meinem Client-Seite, dass ich zwischengespeichert, gibt es einige AJAX Anrufe, die Antworten, die ich co wollen Cache für die Offline-Nutzung? Gibt es einen Weg, das zu erreichen?

Antwort

1

Um dies zu erreichen, müssen Sie zwei Dinge implementieren.

1) eine Möglichkeit, die Ajax-Antwort abzufangen und zwischenzuspeichern. 2) eine Möglichkeit, das zwischengespeicherte Ergebnis bei einer Ajax-Anfrage zu liefern.

Teil # 1 Sie können ein JavascriptInterface und jQuery verwenden, um die AJAX-Antwort abzufangen. Schauen Sie sich here für ein Beispiel an, wie man das JavascriptInterface benutzt. Danach können Sie die Antwort zwischenspeichern

Teil 2 (oder 1 & 2) Sie können den zwischengespeicherten Inhalt mit der Methode sentInterceptRequest von WebViewClient bereitstellen. Schauen Sie sich here für ein Beispiel an. In diesem Beispiel können Sie # part 1 kombinieren und einen Netzwerkaufruf tätigen, um die Ajax-Antwort manuell abzurufen.

Hier ist ein Beispiel, mit dem Sie arbeiten können.

 @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

oh schön .... klingt wie es funktioniert Ich werde es später versuchen, und wenn es funktioniert, werden Sie belohnt :) PS die "Part # 1" Lösung ist, wie man Ajax Anrufe von der App in der Webansicht und um Feedback zu erhalten, wenn es beginnt und wenn es endet ... die "Part # 2" -Lösung klingt wie die richtige Antwort, so dass Sie die Zitate aus dem Code zur vollständigen Antwort senden können Dank –

+1

Ich habe es fast geschafft arbeite so, dass ich dir das Kopfgeld gebe, weil es bald ausläuft und sobald ich das Loch-Ding fertig habe, werde ich die komplette Lösung posten –

Verwandte Themen