So last post was about HTML5 and WebViews but it didn’t cover offline usage and especially caching.
HTML5 is cool. It can work offline once cached by the browser. The main mechanism for offline HTML5 is the so called Manifest. Basically it’s a file which lists entries (js files, pictures, css, etc.) to be cached by the browser.
To enable cache in Android’s WebView we must do at least the following:
webView.setWebChromeClient(new WebChromeClient() { @Override public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) { quotaUpdater.updateQuota(spaceNeeded * 2); } }); webView.getSettings().setDomStorageEnabled(true); // Set cache size to 8 mb by default. should be more than enough webView.getSettings().setAppCacheMaxSize(1024*1024*8); // This next one is crazy. It's the DEFAULT location for your app's cache // But it didn't work for me without this line. // UPDATE: no hardcoded path. Thanks to Kevin Hawkins String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); webView.getSettings().setAppCachePath(appCachePath); webView.getSettings().setAllowFileAccess(true); webView.getSettings().setAppCacheEnabled(true);
This will work. Well, this will make your WebView support caching.. doesn’t mean it will actually work.
You can tune cache policies using the following code, even though it’s not required to make it work:
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
Now when all the cache is setup we would like to see our HTML5 site working in pure offline mode.. but we don’t!
Why? well.. if it’s not working for you it probably means that the site you load up with the following call is actually redirecting you somewhere else:
webView.loadUrl("http://myHTML5app.com/app/");
If /app/ is resolving to a redirect – you are in trouble, sir.
The Cache mechanism will cache the actual RESULT of the redirect and sure it will map it to the url you are being REDIRECTED to, not the one you originally called. So once you are offline – the cache has no clue about the /app/ url and thus you are simply given the default android “can’t open page” replacement.
There are at least two ways to solve this issue..
Get rid of the redirect on the server
Re-redirect on android side
The first option is bad because you typically don’t want to mess with the working HTML5 site which is working on pure Browsers (iPhone, desktop, etc.).
To implement the second option I used the following code in the WebViewClient implementation:
@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // The magic redirect if( "http://HTML5app.com/app/".equals(failingUrl) ) { // main.html is the place we are redirected to by the server if we are online mWebView.loadUrl("http://HTML5app.com/app/main.html"); return; } else if( "http://HTML5app.com/app/main.html".equals(failingUrl) ) { // The cache failed – We don't have an offline version to show // This code removes the ugly android's "can't open page" // and simply shows a dialog stating we have no network view.loadData("", "text/html", "UTF-8"); showDialog(DIALOG_NONETWORK); } }
Good luck!
=======================================
对于UIWebView不支持html5 cache的问题,可以参考:
http://stackoverflow.com/questions/1540240/html5-cache-manifest-in-a-uiwebview
相关推荐
5. 设置缓存路径:默认情况下,WebView会自动管理缓存。但如果你想自定义缓存位置,可以通过setDatabasePath()和setAppCachePath()方法设置。 ```java File cacheDir = getCacheDir(); // 获取应用的缓存目录 ...
Android WebView 缓存详解 一. 两种缓存类型: 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器 的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。WebView不仅能够加载远程HTTP/HTTPS网址,还能处理本地HTML、CSS和JavaScript资源,极大地增强了应用...
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setDomStorageEnabled(true); ``` 以上就是Android中使用...
5. **WebSettings**:`WebSettings`类用于配置WebView的行为,比如设置是否支持JavaScript (`setJavaScriptEnabled(true)`), 设置缓存策略 (`setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK)`), 设置页面缩放 (`...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,实现与网页的交互。本文将深入探讨如何使用Android WebView加载网页,包括基本使用、配置设置、与JavaScript交互以及处理网络...
本文将深入探讨如何在Android的WebView中支持HTML5的video标签内容自动播放,以及相关的优化技巧和注意事项。 一、WebView与HTML5视频播放 HTML5的`<video>`标签为网页提供了内置的视频播放功能,无需依赖Flash等...
比如在`onPause()`和`onDestroy()`方法中调用`webView.onPause()`和`webView.clearCache(true); webView.stopLoading();`来暂停WebView并清理缓存。 至此,我们就完成了Android应用中的第一个WebView示例。用户在...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容。当我们需要在WebView中加载本地图片并让其自适应布局大小时,会涉及到一系列的技术点。以下将详细阐述如何实现这一功能。 ...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。然而,对于复杂的网页,特别是那些包含大量图片的页面,优化图片的加载和显示至关重要。本篇将详细介绍如何在Android的...
在Android开发中,`WebView` 是一个非常重要的组件,它允许开发者在应用程序内嵌入一个浏览器,用于显示网页内容。本篇文章将详细讲解如何利用 `WebView` 实现网页数据的缓存,使得在网络不稳定或者断开的情况下,...
1. 内存管理:由于WebView会占用大量内存,因此在不使用时应及时释放,如在Activity的`onPause()`或`onDestroy()`方法中调用`webView.clearCache(true)`和`webView.loadUrl("about:blank")`。 2. 性能优化:使用硬件...
- **减少内存占用**:合理使用`WebView.clearCache()`和`WebView.clearHistory()`清理缓存和历史记录。 - **释放资源**:当不再使用WebView时,调用`destroy()`或`removeView()`方法释放资源,避免内存泄漏。 7. ...
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); webView.getSettings().setAppCacheEnabled(true); ``` - **硬件加速**:开启硬件加速可以提升WebView的渲染性能。 ```java webView....
本文将深入探讨如何在Android中利用WebView实现HTML5标签的使用,特别是处理视频标签,并确保链接在WebView内跳转,避免内存泄漏问题。 首先,我们需要在AndroidManifest.xml文件中为应用添加INTERNET权限,因为...
- `WebView.clearHistory()`、`clearCache()`和`destroy()`方法分别用于清除浏览历史、缓存和销毁WebView实例。 9. **性能优化** - 使用`WebView.setLayerType()`可以开启硬件加速,提升渲染性能。 - 适当使用`...
- 使用`WebView缓存策略`,如设置为`LOAD_CACHE_ELSE_NETWORK`,可以在离线状态下显示之前加载过的网页。 - 开启硬件加速以提高WebView性能,调用`WebView#setLayerType(View.LAYER_TYPE_HARDWARE, null)`。 8. *...
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); // 使用缓存 webView.loadUrl("file:///android_asset/index.html"); // 加载本地资源 ``` ### 8. 处理回调 在某些场景下,可能需要从...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容,实现与网页的交互。...在实际开发中,WebView经常被用来构建混合应用,结合HTML5技术,可以大大提升开发效率和用户体验。
- 启用缓存:`webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);` - 预加载网页:`webView.loadUrl("javascript:(function() { ... })()");` - 关闭不必要的特性:如不需要视频、地理定位...