Mam WebView w jednym z moich działań i kiedy ładuje stronę internetową, strona zbiera pewne dane tła z Facebooka.
Widzę jednak, że strona wyświetlana w aplikacji jest taka sama za każdym razem, gdy aplikacja jest otwierana i odświeżana.
Próbowałem ustawić WebView, aby nie używał pamięci podręcznej i wyczyścił pamięć podręczną i historię WebView.
Ja też postąpiłem zgodnie z sugestią: Jak opróżnić pamięć podręczną dla WebView?
Ale nic z tego nie działa, czy nikt nie ma pomysłów na to, że mogę rozwiązać ten problem, ponieważ jest to istotna część mojej aplikacji.
mWebView.setWebChromeClient(new WebChromeClient()
{
public void onProgressChanged(WebView view, int progress)
{
if(progress >= 100)
{
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
}
else
{
mProgressBar.setVisibility(ProgressBar.VISIBLE);
}
}
});
mWebView.setWebViewClient(new SignInFBWebViewClient(mUIHandler));
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.clearHistory();
mWebView.clearFormData();
mWebView.clearCache(true);
WebSettings webSettings = mWebView.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
Time time = new Time();
time.setToNow();
mWebView.loadUrl(mSocialProxy.getSignInURL()+"?time="+time.format("%Y%m%d%H%M%S"));
Więc zaimplementowałem pierwszą sugestię (chociaż zmieniłem kod na rekurencyjny)
private void clearApplicationCache() {
File dir = getCacheDir();
if (dir != null && dir.isDirectory()) {
try {
ArrayList<File> stack = new ArrayList<File>();
// Initialise the list
File[] children = dir.listFiles();
for (File child : children) {
stack.add(child);
}
while (stack.size() > 0) {
Log.v(TAG, LOG_START + "Clearing the stack - " + stack.size());
File f = stack.get(stack.size() - 1);
if (f.isDirectory() == true) {
boolean empty = f.delete();
if (empty == false) {
File[] files = f.listFiles();
if (files.length != 0) {
for (File tmp : files) {
stack.add(tmp);
}
}
} else {
stack.remove(stack.size() - 1);
}
} else {
f.delete();
stack.remove(stack.size() - 1);
}
}
} catch (Exception e) {
Log.e(TAG, LOG_START + "Failed to clean the cache");
}
}
}
Jednak to nadal nie zmieniło tego, co wyświetla strona. W mojej przeglądarce komputerowej otrzymuję inny kod HTML niż strona internetowa utworzona w WebView, więc wiem, że WebView musi gdzieś buforować.
Na kanale IRC wskazano mi poprawkę, aby usunąć buforowanie z połączenia URL, ale nie widzę jeszcze, jak zastosować to do WebView.
http://www.androidsnippets.org/snippets/45/
Jeśli usunę aplikację i ponownie ją zainstaluję, mogę przywrócić aktualną wersję strony internetowej, tj. Wersję niebuforowaną. Główny problem polega na tym, że zmiany są dokonywane w linkach na stronie internetowej, więc front-end strony pozostaje całkowicie niezmieniony.
mWebView.getSettings().setAppCacheEnabled(false);
nie zadziałało?Odpowiedzi:
Edytowany fragment kodu opublikowany powyżej przez Gaunt Face zawiera błąd polegający na tym, że jeśli katalog nie zostanie usunięty, ponieważ nie można usunąć jednego z jego plików, kod będzie ponawiał w nieskończonej pętli. Przepisałem go tak, aby był prawdziwie rekurencyjny i dodałem parametr numDays, abyś mógł kontrolować, ile lat muszą mieć pliki, które są przycinane:
Mam nadzieję, że przydadzą się innym ludziom :)
źródło
Znalazłem nawet eleganckie i proste rozwiązanie do czyszczenia pamięci podręcznej
http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29
Próbowałem znaleźć sposób na wyczyszczenie pamięci podręcznej, ale wszystko, co mogliśmy zrobić za pomocą wyżej wymienionych metod, to usunięcie plików lokalnych, ale nigdy nie wyczyściło to pamięci RAM.
API clearCache zwalnia pamięć RAM używaną przez przeglądarkę internetową, a tym samym nakazuje ponowne załadowanie strony internetowej.
źródło
Znalazłem poprawkę, której szukałeś:
Z jakiegoś powodu Android tworzy złą pamięć podręczną adresu URL, który przez przypadek zwraca zamiast nowych potrzebnych danych. Jasne, możesz po prostu usunąć wpisy z bazy danych, ale w moim przypadku próbuję uzyskać dostęp tylko do jednego adresu URL, więc usunięcie całej bazy danych jest łatwiejsze.
I nie martw się, te bazy danych są po prostu powiązane z twoją aplikacją, więc nie czyścisz pamięci podręcznej całego telefonu.
źródło
Aby wyczyścić wszystkie pamięci podręczne widoku internetowego podczas wylogowywania się z aplikacji:
Dla Lollipopa i nowszych:
źródło
Powinno to wyczyścić pamięć podręczną aplikacji, która powinna znajdować się w miejscu, w którym znajduje się pamięć podręczna widoku internetowego
źródło
Jedyne rozwiązanie, które na mnie działa
źródło
U mnie działa po prostu poniższy kod w Kotlinie
źródło
Aby wyczyścić plik cookie i pamięć podręczną z Webview,
źródło
Aby wyczyścić historię, po prostu wykonaj:
Źródło: http://developer.android.com/reference/android/webkit/WebView.html
źródło
Upewnij się, że używasz poniższej metody, aby dane formularza nie były wyświetlane jako autopop po kliknięciu pól wejściowych.
źródło
źródło
Może wyczyścić konto Google w moim widoku internetowym
źródło
przypadek użycia: lista elementów jest wyświetlana w widoku recyklera, po każdym kliknięciu elementu ukrywa widok recyklera i wyświetla widok sieciowy z adresem URL elementu.
problem: mam podobny problem, w którym po otwarciu
url_one
widoku w przeglądarce internetowej, a następnie próbie otwarcia innegourl_two
w widoku sieciowym, wyświetla się onurl_one
w tle do momentuurl_two
załadowania.rozwiązanie: aby rozwiązać to, co zrobiłem, załaduj pusty ciąg,
""
tak jakurl
tuż przed ukryciemurl_one
i załadowaniemurl_two
.dane wyjściowe: za każdym razem, gdy ładuję nowy adres URL w widoku sieci Web, w tle nie wyświetla się żadna inna strona internetowa.
kod
źródło