2012-10-22 5 views
9

Mam bardzo prosty WebView w mojej aplikacji, który wyświetla okno "Witamy".101 sposobów na wyczyszczenie pamięci podręcznej WebView - z których wszystkie nie działają

wyślę poprzek języka na serwerze, aby odpowiedzieć tak:

Map<String, String> noCacheHeaders = new HashMap<String, String>(2); 
noCacheHeaders.put("Pragma", "no-cache"); 
noCacheHeaders.put("Cache-Control", "no-cache"); 
noCacheHeaders.put("Accept-Language", Locale.getDefault().toString()); 
mWebView.loadUrl("www.fake.com", noCacheHeaders); 

Działa to dobrze - jednak, gdy mogę zmienić język urządzeń, chcę język WebView się również zmienić, mogę zobacz wartość "Accept-Language" zmienia się poprawnie podczas debugowania, ale zawartość nie zmienia się w WebView. Szukałem sposobów na zatrzymanie buforowania, które opisuję poniżej. Żadna z nich nie powoduje, że witryna ładuje się inaczej po zmianie języka.

Aby upewnić się, że serwer nie jest problemem z buforowaniem, zapewniam, że zawartość WebView zmieni się po wyczyszczeniu "Dane aplikacji" i ponownym uruchomieniu. Dowód na to, że aplikacja przechowuje dane WebView.

Podążałem więc wieloma różnymi sugestiami, które wymienię poniżej. Nie jeden z nich rzeczywiście się zmienia treść mojego WebView:

Od here co powoduje awarię:

mWebView.clearCache(true); 
mContext.deleteDatabase("webview.db"); 
mContext.deleteDatabase("webviewCache.db"); 

Wystarczy to na swój własny (zarówno przed loadURL po nim, a onProgress = 100) :

mWebView.clearCache(true); 

Od here:

mWebView.getSettings().setAppCacheMaxSize(0); 

Próbowałem również:

mWebView.getSettings().setAppCacheEnabled(false); 

Wszystkie wyniki w tym samym zachowaniu. Mój WebView, zmieniając język urządzenia na angielski z niemieckiego, nadal zachowywał zawartość strony niemieckiej.

Oto cały kod razem:

Map<String, String> noCacheHeaders = new HashMap<String, String>(2); 
    noCacheHeaders.put("Pragma", "no-cache"); 
    noCacheHeaders.put("Cache-Control", "no-cache"); 
    noCacheHeaders.put("Accept-Language", Locale.getDefault().toString()); 

    mWebView.getSettings().setAppCacheEnabled(false); 
    mWebView.clearCache(true); 
    mWebView.getSettings().setAppCacheMaxSize(0); 

    mWebView.setWebChromeClient(new WebChromeClient() { 
      public void onProgressChanged(WebView view, int progress) {     
       mProgress.setProgress(progress); 
       try { 
        getActivity().setProgress(progress); 
        if(progress == 100) { 
         mProgress.setVisibility(View.GONE); 
         mWebView.clearCache(true); 
        } 
       } catch(Exception e) { 
        e.printStackTrace(); 
       } 
      } 
    }); 
    mWebView.loadUrl("www.fake.com", noCacheHeaders); 
    mWebView.clearCache(true);  

Powtarzalne czynności:

  1. Zainstaluj aplikację
  2. Otwarte Webview - English zawartość.
  3. stop force App
  4. Zmień język na niemiecki Device
  5. Otwórz App & WebView - English treści.
  6. stop force App
  7. Wyczyść App Dane
  8. Otwórz App & WebView - Niemiecki treści.
+0

Uwielbiam tytuł! Nie mógłbyś być bardziej poprawny. – DroidT

Odpowiedz

10
CookieSyncManager.createInstance(this);   
CookieManager cookieManager = CookieManager.getInstance();   
cookieManager.removeAllCookie(); 
+0

Fantastyczne ... dlaczego serwer łączy język z sesją jest poza mną. – Graeme

+7

Proszę wyjaśnij, dlaczego tworzysz instancję 'CookieSyncManager', a następnie użyj' CookieManager', aby faktycznie usunąć pliki cookie. – ohcibi

+0

świetnie! wreszcie odpowiedź, która działa !!! THX – kyp

Powiązane problemy