отображение кэшированной версии веб-просмотра в Android - PullRequest
9 голосов
/ 12 декабря 2011

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

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

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

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

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

Вот несколько строк кода, которые я добавил для настройки веб-просмотра:

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 ]

6 голосов
/ 20 декабря 2011

Попробуйте узнать состояние сети, используя

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(...)
2 голосов
/ 14 декабря 2011

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


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

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

Однако требуемое поведение, по-видимому, не является одним из следующих:

  1. LOAD_CACHE_ELSE_NETWORK

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

  2. LOAD_CACHE_ONLY

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

  3. LOAD_DEFAULT

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

  4. LOAD_NORMAL

    Шаблон нормального использования кэша

  5. LOAD_NO_CACHE

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


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


1 голос
/ 22 февраля 2016

Сначала вы должны установить разрешение в вашем 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");

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

1 голос
/ 20 декабря 2011

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

<html manifest="mycache.appcache">

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...