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

120
6

Я пытаюсь отобразить офлайн-кешированную версию 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();, то кэшированная версия страницы будет отображаться в порядке.


Вот несколько строк кода, которые я добавил для настройки 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);

спросил(а) 2011-12-12T01:21:00+04:00 8 лет, 6 месяцев назад
1
Решение
102

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


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(...)

ответил(а) 2011-12-20T13:01:00+04:00 8 лет, 6 месяцев назад
66

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


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


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



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

    LOAD_CACHE_ELSE_NETWORK

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

    LOAD_CACHE_ONLY


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



    LOAD_DEFAULT


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



    LOAD_NORMAL


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



    LOAD_NO_CACHE


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



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

ответил(а) 2011-12-14T11:48:00+04:00 8 лет, 6 месяцев назад
55

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


<html manifest="mycache.appcache">

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

ответил(а) 2011-12-20T16:52:00+04:00 8 лет, 6 месяцев назад
39

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

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

ответил(а) 2016-02-22T11:58:00+03:00 4 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема