Android Webview ClearCache очень медленный

Я использую WebViews в приложении для Android, и мне нужно предотвратить кэширование WebView.

К сожалению, похоже, что эта, казалось бы, простая цель почти невозможна. Решением, к которому я прибегал, является выполнение webview.clearCache(true) в событии onPageFinished, так что кеш очищается каждый раз, когда загружается страница. Есть некоторые проблемы...

Я заметил, что по мере роста кеша становится очень трудоемким для выполнения метода clearCache. Иногда, если вы выполняете clearCache, а затем переключаетесь на другое действие, которое содержит другое веб-представление, этот веб-просмотр не будет загружаться в течение нескольких секунд, потому что он все еще ждет завершения предыдущей операции clearCache.

Что еще хуже, время выполнения последующих вызовов clearCache, похоже, не уменьшается после того, как кеш уже очищен. Если вызов clearCache занимает 3 секунды, а затем я сразу вызываю clearCache второй раз, тогда я ожидаю, что второй вызов clearCache завершится почти сразу. Но это не то, что я испытываю; Я испытываю, что второй вызов clearCache по-прежнему занимает приблизительно 3 секунды.

Кто-нибудь еще испытал это? Есть ли способ повысить производительность? Ожидание 2-3 секунд для загрузки webview (из локальной файловой системы) ужасно.

EDIT:

Вот моя лучшая альтернатива фактическому очистке кеша. Это более или менее работает, но это вроде flaky, и я не на 100% доволен этим (написано в Mono С#):

public class NoCacheWebClient : WebViewClient
{
    string previous;

    public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
    {
        base.OnPageStarted(view, url, favicon);

        if (!string.Equals(previous, url))
        {
            previous = url;
            view.Reload(); //re-load once to ignore cache
        }
        else
        {
            previous = null;
        }
    }
}

Ответ 1

1) Попробуйте использовать setAppCacheEnabled и setAppCacheMaxSize чтобы ограничить размер кеша очень мало, более низкий размер кеша приведет к более быстрой очистке.

Пример: wv.getSettings().setAppCacheMaxSize(1);

ИЛИ

2) Если вам не нужны кэшированные данные, просто установите setCacheMode (WebSettings.LOAD_NO_CACHE);, что означает "Не используйте кеш, загружайте из сети" , даже если данные кэшируются.

Вкратце, просто игнорируйте кешированные данные, андроид позаботится об этом.

ИЛИ

3) вы также можете попробовать приведенный ниже код для без кэширования,

Примечание. Это доступно только для Android API 8 +

    Map<String, String> noCacheHeaders = new HashMap<String, String>(2);
    noCacheHeaders.put("Pragma", "no-cache");
    noCacheHeaders.put("Cache-Control", "no-cache");
    view.loadUrl(url, noCacheHeaders);

ИЛИ

4) Очищайте кеш каждый раз, когда заканчивается загрузка страницы. Что-то вроде этого в WebViewClient.

@Override
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    view.clearCache(true);
}

ИЛИ

5) Вы можете сразу удалить всю кэшированную базу данных.

    context.deleteDatabase("webview.db");
    context.deleteDatabase("webviewCache.db");

Это может дать немного более быстрый результат, надеюсь, что так.

Ответ 2

По мере того, как вы переходите к следующему действию, завершите предыдущую операцию. Чтобы вы могли освободить всю память, занятую этим действием. Надеюсь, это поможет.