отображение кэшированной версии webview в android

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

я отменил onReceivedError ok, и когда сеть не работает, этот метод вызывается. Проблема в том, что он отображает общее сообщение "веб-страница недоступна".

как я могу получить его для отображения HTML5 кэшированной версии страницы? Автономное хранилище webapp определенно работает, так как оно отлично работает в настольной версии Firefox и Chrome.

Я знаю, что могу позвонить loadData в представление вручную в onReceivedError, но я не уверен, где я могу получить кэшированное значение HTML5.

Примечание: Если я установил некоторые фиктивные данные в loadData например view.loadData(Uri.encode("<html><div>Page load failed</div></html>"), "text/html", "UTF-8"); а затем нажмите назад (путем обнаружения события назад и вызова webview.goBack(); затем отображается кэшированная версия страницы ok.

вот несколько строк кода, которые я добавил для настройки webview:

webview.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webview.getSettings().setAppCacheMaxSize(1024*1024*8);                         
webview.getSettings().setAppCachePath("/data/data/com.stuff.android/cache");
webview.getSettings().setAllowFileAccess(true);
webview.getSettings().setAppCacheEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setJavaScriptEnabled(true);

4 ответов


попробуйте узнать состояние сети с помощью

private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager 
          = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null;
}

(определить, есть ли подключение к Интернету на Android)

Это также необходимо

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

в вашем AndroidManifest.в XML

Теперь вы можете установить поведение кэша либо LOAD_CACHE_ONLY или LOAD_NO_CACHE, в зависимости от того, доступно ли сетевое соединение, с

webview.getSettings().setCacheMode(...)

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


Это странно.. Согласно документация:

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

однако поведение, которое вы хотите, не кажется одним из них:

  1. LOAD_CACHE_ELSE_NETWORK

    использовать кэш, если контент есть, даже если истек (например, история nav), если его нет в кэше, загрузите из сети.

  2. LOAD_CACHE_ONLY

    Не используйте сеть, загружайте только из кэша.

  3. LOAD_DEFAULT

    шаблон использования кэша по умолчанию

  4. LOAD_NORMAL

    обычное использование кэша шаблон

  5. LOAD_NO_CACHE

    Не используйте кэш, загрузите из сети


Я не знаю, можете ли вы подкласс WebView получить желаемый поток.



не работает, если вы просто дайте браузеру справиться с этим? Укажите манифест в теге HTML следующим образом:

<html manifest="mycache.appcache">

...и браузер должен автоматически использовать его, когда нет подключения, вам не нужно менять какие-либо настройки вообще.


вы должны сначала установить разрешение в AndroidManifest.в XML

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

затем проверьте интернет-сеть включена или выключена:

private boolean isNetworkAvailable() {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService( CONNECTIVITY_SERVICE );
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            return activeNetworkInfo != null && activeNetworkInfo.isConnected();
        }

наконец добавьте ниже код с вашим объект WebView объект

webView = (WebView) findViewById(R.id.WebEngine);
        webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 ); // 5MB
        webView.getSettings().setAppCachePath( getApplicationContext().getCacheDir().getAbsolutePath() );
        webView.getSettings().setAllowFileAccess( true );
        webView.getSettings().setAppCacheEnabled( true );
        webView.getSettings().setJavaScriptEnabled( true );
        webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
        if ( !isNetworkAvailable() ) { // loading offline
            webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
        }
webView.loadUrl("http://www.geekonjava.blogspot.com/?m=1");

это если интернет вашей веб-страницы открыть нормальную версию и сохранены в кэше, и если ваш интернет отключен затем он автоматически открыть в кэш версия.