WebView завантажує веб-сайт в Інтернеті, завантажує локальний файл в автономному режимі


74

Я насправді новачок у програмуванні на Java, але я тут дотримувався кількох рішень своєї проблеми, але не знайшов такого, який відповідає моєму випадку, і, здається, я не можу правильно отримати код.

Я хотів би мати, WebViewщо відкриває сторінку в Інтернеті (наприклад, Google), коли телефон в мережі, і відкриває локальну сторінку HTML, коли телефон не в мережі.

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

Будь-які ідеї щодо того, як це можна зробити? Деякі прості вказівки у правильному напрямку можуть допомогти.

Дуже дякую.

Відповіді:


129

Це для мене звучить як простий механізм кешування веб-перегляду.

Наступне має робити те, що ви шукаєте:

WebView webView = new WebView( context );
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 ); // load online by default

if ( !isNetworkAvailable() ) { // loading offline
    webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
}

webView.loadUrl( "http://www.google.com" );

Метод isNetworkAvailable()перевіряє активне підключення до мережі:

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

Нарешті, не забудьте додати наступні три дозволи до своїх 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"/>

2
це справді повне .. працює як шарм! велике спасибі за показ режиму кешування
mstation

@jenzz: У мене дві проблеми з вашим рішенням. По-перше, у моєму випадку все, що відображається в кеш-папці (зовнішня SD-карта), - це порожній файл, який називається ApplicationCache.db. Не повинно бути більше ?? Можливо, кеш зберігається в іншому місці? По-друге, ця .setAppCacheMaxSize()річ застаріла в API18, не знаючи, як додати більше чашу тоді ...
Луїс А. Флорит

Надалі квота буде керуватися автоматично. Немає необхідності встановлювати їх.
аншад

5
"Це звучить для мене як простий механізм кешування веб-перегляду". thug life 8)
AndBecaPine

2
Не працює у мене, коли програму вбивають і завантажують знову в автономному режимі. Хороша робота все ще +1
Skynet

22

ось випадки, коли WebView не може бути кешовано власним чином. Якщо заголовок сторінки містить наступні поля, WebView не зможе кешувати вміст цієї сторінки. Керування кешем: no-store, no-cache Pragma: no-cache

У цьому випадку вам доведеться змінити властивість сторінки на сервері, щоб вирішити проблему кешування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.