热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在android中显示webview的缓存版本-displayingcachedversionofwebviewinandroid

IamtryingtogettheHTML5offlinecachedversionofawebsitetodisplaywhenthenetworkisdown

I am trying to get the HTML5 offline cached version of a website to display when the network is down inside of a webview.

我正在试图让HTML5离线缓存版本的网站显示当网络在一个webview的内部。

I have overridden onReceivedError ok, and when the network is down this method is called. Problem is that it displays the generic "Web Page is not available" message.

我重写了onReceivedError ok,当网络关闭时,这个方法将被调用。问题是它会显示通用的“Web页面不可用”消息。

How can I get it to display the HTML5 cached version of the page? The offline storage of the webapp is definately working, as it works fine in the desktop version of Firefox and Chrome.

如何让它显示HTML5缓存的页面版本?webapp的离线存储肯定是有效的,因为它在Firefox和Chrome的桌面版本中运行良好。

I know I can call loadData into the view manually in onReceivedError, but im not sure where I can get the HTML5 cached value from.

我知道我可以在onReceivedError中手动调用loadData到视图中,但我不确定从哪里可以获得HTML5缓存的值。

Note: If I set some dummy data in loadData such as view.loadData(Uri.encode("

Page load failed
"), "text/html", "UTF-8"); and then click back (by detecting back event and calling webview.goBack(); then the cached version of the page is displayed ok.

注意:如果我在loadData(如view.loadData)中设置一些假数据(Uri)。编码(“

页面加载失败 ”),“text / html”、“utf - 8”);然后单击back(通过检测返回事件并调用webview.goBack();然后显示页面的缓存版本。

Here are some lines of code I added to setup the webview:

下面是我为安装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 个解决方案

#1


6  

Try to find out the network status using

尝试找出使用的网络状态

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

(Detect whether there is an Internet connection available on Android)

(检测Android上是否有互联网连接)

This also needs

这也需要


in your AndroidManifest.xml

在你AndroidManifest.xml

Now you can set the cache behaviour either to LOAD_CACHE_ONLY or to LOAD_NO_CACHE, depending on whether a network connection is available, with

现在,您可以将缓存行为设置为LOAD_CACHE_ONLY或LOAD_NO_CACHE,这取决于网络连接是否可用

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

#2


2  

I think a good solution would be to use LOAD_NORMAL and onReceivedError Navigate BACK. I think this will load the cache according to the documentation (not sure if I remember correctly) but be carefull no to get stuck in an infinite loop

我认为一个好的解决方案是使用LOAD_NORMAL和onReceivedError返回。我认为这将根据文档加载缓存(不确定我是否记得正确),但是要小心不要陷入无限循环中。


It is weird.. According to the documentation:

这是奇怪的。根据文档:

Override the way the cache is used. The way the cache is used is based on the navigation option. For a normal page load, the cache is checked and content is re-validated as needed. When navigating back, content is not revalidated, instead the content is just pulled from the cache. This function allows the client to override this behavior.

重写缓存的使用方式。使用缓存的方式基于导航选项。对于正常的页面加载,缓存被检查,并且根据需要重新验证内容。当导航回来时,内容不会被重新验证,而是从缓存中提取内容。此函数允许客户端重写此行为。

However the behavior you want does not seem to be one of these:

然而,你想要的行为似乎并不是其中之一:

  1. LOAD_CACHE_ELSE_NETWORK

    Use cache if content is there, even if expired (eg, history nav) If it is not in the cache, load from network.

    如果内容存在,使用缓存,即使过期(例如,历史资产净值),如果不在缓存中,从网络加载。

  2. LOAD_CACHE_ONLY

    LOAD_CACHE_ONLY

    Don't use the network, load from cache only.

    不要使用网络,只从缓存加载。

  3. LOAD_DEFAULT

    LOAD_DEFAULT

    Default cache usage pattern

    默认的缓存使用模式

  4. LOAD_NORMAL

    LOAD_NORMAL

    Normal cache usage pattern

    正常的缓存使用模式

  5. LOAD_NO_CACHE

    LOAD_NO_CACHE

    Don't use the cache, load from network

    不要使用缓存,从网络加载


I do not know if you can subclass the WebView to get the desired flow.

我不知道您是否可以子类化WebView来获得所需的流。


#3


1  

Does it not work if you simply let the browser handle this? Specify the manifest in the HTML tag like this:

如果你只是让浏览器来处理这个问题,它会不会工作?在HTML标记中指定清单如下所示:


...and the browser should automatically use it when there's no connection available, you shouldn't need to change any settings at all.

…当没有连接时,浏览器应该自动使用它,你根本不需要改变任何设置。

#4


0  

You should firstly set permission in your AndroidManifest.xml

您应该首先在AndroidManifest.xml中设置权限




Then check internet network is on or off by :

然后查查互联网网络是开还是关:

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

At last add below code with your Webview object

最后用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");

Thats it if your internet is on your webpage open normal version and saved in cached and if your internet is off then it automatically open in cached version.

如果你的互联网在你的网页上打开正常的版本,并保存在缓存里,如果你的互联网关闭了,它会自动打开缓存的版本。


推荐阅读
  • 1<table>2<tr>3<th>ID<th>4 ... [详细]
  • Cocos2d-HTML5初学者指南:第一部分基础知识
    本文旨在为初学者提供Cocos2d-HTML5的基础知识入门指南。虽然作者在交大期间学习了基础的Web技术和AS3游戏开发,但感觉这些知识与实际应用仍有差距。几年前曾接触过Android开发,但由于缺乏C++和Objective-C的背景,未能深入。本篇将详细介绍Cocos2d-HTML5的核心概念和技术要点,帮助读者快速上手并掌握游戏开发的基本技能。 ... [详细]
  • 本文详细介绍了如何通过配置 Chrome 和 VS Code 来实现对 Vue 项目的高效调试。步骤包括启用 Chrome 的远程调试功能、安装 VS Code 插件以及正确配置 launch.json 文件。 ... [详细]
  • Activity跳转动画 无缝衔接
    Activity跳转动画 无缝衔接 ... [详细]
  • 本文详细介绍了一种实现PopupWindow全屏显示且能有效隐藏虚拟按键的技术方案,适用于Android开发。此方法经过实际测试,表现良好,兼容性优秀。 ... [详细]
  • 本文介绍了在解决Hive表中复杂数据结构平铺化问题后,如何通过创建视图来准确计算广告日志的曝光PV,特别是针对用户对应多个标签的情况。同时,详细探讨了UDF的使用方法及其在实际项目中的应用。 ... [详细]
  • BL550721、特点液晶驱动输出:Common输出4线,Segment输出36线内置显示寄存器364144bit2线串行接口(SCL,SDA)内置震荡电路内置液晶驱动电源电路13 ... [详细]
  • index.js全部js兼容性处理。js内引入babelpolyfill全部js兼容性处理。babelpolyfillimportbabelpolyfill;constadd ... [详细]
  • 微服务自动化.dockercompose
    目录一、docker-compose二、docker-compose安装与配置1、修改docker.service2、下载文件3、将刚才下载的docker-compose文 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • 本文介绍了如何利用摄像头捕捉图像,并将捕获的图像数据保存为文件。通过详细的代码示例,展示了摄像头调用的具体实现方法,适用于多种应用场景,如安全监控、图像处理等。 ... [详细]
  • 本文出处:炎之铠csdn博客:http:blog.csdn.nettotond炎之铠邮箱:yanzhikai_yjk@qq.com本文原创,转载请注明本出处!前言 ... [详细]
  • Android常见漏洞漏洞名称:Log敏感信息泄露漏洞描述: 程序运行期间打印了用户的敏感信息,造成泄露修改建议: 建议禁止隐私信息的log  ... [详细]
  • FileReader详解与实例---读取并显示图像文件
    我们曾经在《HTML5中File对象初探》中,使用到了FileReader,在那篇文章中,它被用来将一个文件读取为二进制字符串,并通过xhr发送到后端形成交互。作为FileAPI的一部 ... [详细]
  • 活动主题:五一巨献,问答有礼,105QB送给IT互联网界的劳动人民活动时间:4月30日晚上10点~5月2日晚上10点网址:http:ask.jiutianniao.com ... [详细]
author-avatar
多米音乐_53913411
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有