如果没有连接,Android WebView 不会加载缓存的网站

2023-12-24

我正在尝试缓存 WebView 中加载的网站,但如果网络连接关闭,我将无法使其工作。

Cachdirectory 已创建,缓存文件就在那里。已授予权限。我加载网页然后关闭网络(也给出了 WI-FI 权限),当我尝试重新加载页面时出现错误(现在应该从缓存加载)。请帮忙!

这是代码:

WebView engine=(WebView)findViewById(R.id.web_engine);
    engine.getSettings().setJavaScriptEnabled(true);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.getSettings().setLoadsImagesAutomatically(true);
    engine.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    engine.setInitialScale(1);

    engine.setWebViewClient(new WebViewClient());
    
    engine.setWebChromeClient(new WebChromeClient() 
    {
          @Override
             public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,QuotaUpdater quotaUpdater)
             {
                   quotaUpdater.updateQuota(spaceNeeded * 2);
             }
          public void onProgressChanged(WebView view, int progress)
          {
              activity.setTitle("Loading...");
              activity.setProgress(progress * 100);

              if(progress == 100)
              { 
                  activity.setTitle(R.string.app_name);
              }
          }
       });
    
    String appCachePath;
    
    engine.getSettings().setDomStorageEnabled(true);
   // Set cache size to 8 mb by default. should be more than enough
    engine.getSettings().setAppCacheMaxSize(1024*1024*8);
    appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
    engine.getSettings().setAppCachePath(appCachePath);
    engine.getSettings().setAllowFileAccess(true);
    engine.getSettings().setAppCacheEnabled(true);
    engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

     cm = (ConnectivityManager) this.getSystemService(Activity.CONNECTIVITY_SERVICE);
     if(cm.getActiveNetworkInfo() == null || !cm.getActiveNetworkInfo().isConnected())
     {           
         appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
         engine.getSettings().setAppCachePath(appCachePath);
         
         engine.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
         engine.loadUrl("http://www.google.com");
     }
     else
     {
         System.err.println("CACHE OR NETWROK");
         engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
         engine.loadUrl("http://www.google.com");
     }
}

和权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<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" />

您的使用

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

告诉 WebView 从缓存加载页面,但如果它需要缓存中没有的内容,它会查找网络,当您没有连接时,它只会给您“页面无法加载”错误”。这是因为遗憾的是,并非所有内容都存储在缓存中,即使使用此设置,您也会注意到浏览器使用网络。

让 WebView 忽略无连接的唯一方法是使用

engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);

设置代替。某些图像不会使用此设置加载(因为它们没有缓存),但它仍然会加载在缓存中找到的所有内容。


与您的问题无关的另一个注意事项是,在您的代码中,您使用了 setAppCacheMaxSize ,并且它在 API 18 及更高版本中已被弃用,因为 WebView 自行管理缓存大小,因此请注意这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果没有连接,Android WebView 不会加载缓存的网站 的相关文章

  • 蓝牙适配器.getDefaultAdapter();返回空值

    我开始开发一个应用程序通过蓝牙与arduino设备进行通信 我正在初始化 bt 适配器 BluetoothAdapter btAdapter BluetoothAdapter getDefaultAdapter 问题是 btAdapter
  • 带有垂直选项卡的 Android 布局 - 设计类似于 hello 短信应用程序

    Can somebody please help me out in designing vertical tabs like in the given pic taken from hello sms app 我不要求提供代码片段 所以请
  • SQLite 中的 where 子句在 android 中不起作用:(

    当尝试在 SQLite 中查询某些数据时 我遇到了一个恼人的错误 这是我的代码 Cursor cursor db query TABLE IMAGES new String id name compareToThis null null n
  • 如何使用 Espresso 访问外部网站上的元素

    使用 espresso 我们单击 登录 按钮 该按钮将启动一个外部网站 Chrome 自定义选项卡 您可以在其中登录 然后重定向回我们的 Android 应用程序 Espresso 有没有办法 1 验证正在启动的 URL 是否正确2 访问网
  • Java中如何动态添加charsequence[]中的数据?

    初始化的一种方法charsequence is charsequence item abc def 但我不想以这种方式初始化它 有人可以建议其他方式吗 比如我们初始化的方式string arrays 首先 修复变量声明 charsequen
  • Eddystone Beacon 中广播的 MAC ID 会改变吗?

    我将描述我的设置 我制作了一个模拟 Eddystone 信标的 Android 应用程序 我能够使用 PlayStore 中的 Beacon Toy 应用程序检测手机上的 Eddystone 信标 但问题是 自上次检查以来 显示的 MAC
  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • PinnedHeader Google 加上 GridView?

    背景 Google google 应用程序可以很好地查看 亮点 类别中的图像 对于该屏幕上的每个部分 他们制作了一个标题 其中包含可单击的文本和一个用于选择该部分的所有照片的按钮 对于每个部分 他们还以网格状方式显示照片 它是这样的 这是另
  • 在 Phonegap 3.x CLI 上构建 android 发布 apk

    如何使用 Phonegap 3 x CLI 在本地构建 Android 应用程序并准备发布 我检查了项目的platforms android目录中生成的bin文件夹 并且只有 debug APK 顺便说一句 我使用这个命令 phonegap
  • 对超类方法的调用应该是第一个语句吗?

    语音识别的结果可以在onActivityResult int requestCode int resultCode Intent data 方法 如图这个例子 http developer android com resources sam
  • 如何在 Android 上通过 RTMP 进行流式传输?

    我正在尝试在远程服务器上播放视频文件 视频格式为flv 服务器为Flash Media Server3 5 我将通过 RTMP 连接到服务器并使用 Android Media Player 实现视频文件的播放 真的吗 可能吗 任何帮助都是我
  • 按歌曲获取封面图片

    是否可以按歌曲而不是按专辑获取封面图片 因为我有一张自编的歌曲专辑 而且它们都有不同的封面图片 但是当我想查询它们时 我总是得到相同的图片 String ARG STRING MediaStore Audio Media ALBUM ID
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 将字节数组保存为 Android 设备文件夹中的 jpg 文件

    我正在尝试将图像保存在 Android 设备的文件夹中 我使用的代码如下 var newFolder AndroidEnvironment GetExternalStoragePublicDirectory AndroidEnvironme
  • 找出该月第一个星期日/星期一等的日期

    我想在java中检测每个月第一周 第二周的第一个星期日 星期一的日期 我怎样才能实现它 我已经检查了 java 中的 Calendar 类和 Date 类 但无法找到解决方案 所以请帮助我解决这个问题 Calendar calendar C
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • Android Studio-公司域名

    在Android Studio中 当您创建新项目时 系统会提示您输入域名 我已经知道您可以制作一个 但是如果您想在 Google Play 商店上分发您的应用程序怎么办 即使我永远不会使用我的域 我是否需要购买一个网络域来分发我的应用程序
  • Pebble 应用程序设置中的开发人员选项

    I am following this manual http www sitepoint com pebble watch development javascript and I don t have the Developers Op
  • 在 Android 中将列表传递给另一个 Activity

    我已经创建了一个列表 并希望将该列表传递给另一个活动 但当我创建意图时 我在 putExtra 语句上收到错误 只是想知道是否有任何简单的方法来传递字符串列表而不是单个字符串 Thanks private List
  • Android:如何获取所有可用意图过滤器的列表?

    我搜索了 Android 文档 但由于某些疯狂的原因 我无法找到所有可用意图过滤器的列表 我正在寻找一个意图过滤器 它可以执行诸如通过广播接收器通知我特定活动 例如浏览器或电子邮件 已启动或位于前台之类的操作 有人能帮我吗 PackageE

随机推荐