Android Webview - полностью очистить кэш
У меня есть WebView в одном из моих действий, и когда он загружает веб-страницу, страница собирает некоторые фоновые данные из Facebook.
То, что я вижу, это то, что страница, отображаемая в приложении, одинакова при каждом открытии и обновлении приложения.
Я попытался настроить WebView на использование кеша и очистить кеш и историю WebView.
Я также воспользовался предложением: Как очистить кеш для WebView?
Но ничто из этого не работает, есть ли у кого-нибудь идеи, что я могу преодолеть эту проблему, потому что это жизненно важная часть моего приложения.
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"));
Итак, я внедрил первое предложение (хотя и изменил код на рекурсивный)
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");
}
}
}
Однако это еще не изменило отображаемую страницу. В моем браузере рабочего стола я получаю разный HTML-код на веб-страницу, созданный в WebView, поэтому я знаю, что WebView должен где-то кэшироваться.
На IRC-канале я указал на исправление, чтобы удалить кеширование из URL-соединения, но пока не вижу, как применить его к WebView.
http://www.androidsnippets.org/snippets/45/
Если я удалю свое приложение и переустановить его, я смогу обновить веб-страницу до версии, то есть не кэшированную версию. Основная проблема заключается в внесении изменений в ссылки на веб-странице, поэтому внешний интерфейс веб-страницы не изменяется.
Ответы
Ответ 1
Отредактированный фрагмент кода выше, опубликованный Gaunt Face, содержит ошибку в том, что если каталог не удается удалить, потому что один из его файлов не может быть удален, код будет продолжать повторять в бесконечном цикле. Я переписал его, чтобы быть действительно рекурсивным, и добавил параметр numDays, чтобы вы могли контролировать, сколько лет файлы должны быть обрезаны:
//helper method for clearCache() , recursive
//returns number of deleted files
static int clearCacheFolder(final File dir, final int numDays) {
int deletedFiles = 0;
if (dir!= null && dir.isDirectory()) {
try {
for (File child:dir.listFiles()) {
//first delete subdirectories recursively
if (child.isDirectory()) {
deletedFiles += clearCacheFolder(child, numDays);
}
//then delete the files and subdirectories in this dir
//only empty directories can be deleted, so subdirs have been done first
if (child.lastModified() < new Date().getTime() - numDays * DateUtils.DAY_IN_MILLIS) {
if (child.delete()) {
deletedFiles++;
}
}
}
}
catch(Exception e) {
Log.e(TAG, String.format("Failed to clean the cache, error %s", e.getMessage()));
}
}
return deletedFiles;
}
/*
* Delete the files older than numDays days from the application cache
* 0 means all files.
*/
public static void clearCache(final Context context, final int numDays) {
Log.i(TAG, String.format("Starting cache prune, deleting files older than %d days", numDays));
int numDeletedFiles = clearCacheFolder(context.getCacheDir(), numDays);
Log.i(TAG, String.format("Cache pruning completed, %d files deleted", numDeletedFiles));
}
Надеемся, что это будут другие люди:)
Ответ 2
Я нашел даже элегантное и простое решение для очистки кеша
WebView obj;
obj.clearCache(true);
http://developer.android.com/reference/android/webkit/WebView.html#clearCache%28boolean%29
Я пытался выяснить, как очистить кеш, но все, что мы могли сделать из вышеупомянутых методов, - удалить локальные файлы, но он никогда не очищает ОЗУ.
API clearCache, освобождает RAM, используемую веб-просмотром, и, следовательно, требует перезагрузки веб-страницы.
Ответ 3
Я нашел исправление, которое вы искали:
context.deleteDatabase("webview.db");
context.deleteDatabase("webviewCache.db");
По какой-то причине Android делает плохой кэш URL-адреса, который он продолжает возвращаться случайно, а не новые данные, которые вам нужны. Конечно, вы могли бы просто удалить записи из БД, но в моем случае я только пытаюсь получить доступ к одному URL-адресу, так что проще всего удалить всю БД.
И не беспокойтесь, эти БД просто связаны с вашим приложением, поэтому вы не очищаете кеш всего телефона.
Ответ 4
Чтобы очистить все кэши веб-просмотра, пока вы подписываете форму из своего приложения:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
Для леденцов и выше:
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookies(ValueCallback);
Ответ 5
Это должно очистить кэш приложений, который должен находиться в кеше веб-браузера
File dir = getActivity().getCacheDir();
if (dir != null && dir.isDirectory()) {
try {
File[] children = dir.listFiles();
if (children.length > 0) {
for (int i = 0; i < children.length; i++) {
File[] temp = children[i].listFiles();
for (int x = 0; x < temp.length; x++) {
temp[x].delete();
}
}
}
} catch (Exception e) {
Log.e("Cache", "failed cache clean");
}
}
Ответ 6
Убедитесь, что вы используете метод ниже для того, чтобы данные формы не отображались как autopop при нажатии на поля ввода.
getSettings().setSaveFormData(false);
Ответ 7
Чтобы очистить историю, просто выполните:
this.appView.clearHistory();
Источник: http://developer.android.com/reference/android/webkit/WebView.html
Ответ 8
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();