如果没有连接,Android WebView 不会加载缓存的网站
Posted
技术标签:
【中文标题】如果没有连接,Android WebView 不会加载缓存的网站【英文标题】:Android WebView isn't loading cached Website if there is no connection 【发布时间】:2013-11-19 13:24:21 【问题描述】:我正在尝试缓存 WebView 中加载的网站,但如果网络连接关闭,我将无法使其正常工作。
创建缓存目录,缓存文件在那里。给予许可。我加载网页然后关闭网络(也提供了 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" />
【问题讨论】:
【参考方案1】:你的使用
engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
告诉 WebView 从缓存中加载页面,但如果它需要缓存中没有的任何内容,它会查看网络,当你没有连接时,它只会给你“页面无法加载错误。”这是因为遗憾的是并非所有内容都存储在缓存中,即使使用此设置,您也会注意到浏览器正在使用网络。
让 WebView 忽略无连接的唯一方法是使用
engine.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ONLY);
改为设置。使用此设置某些图像不会加载(因为它们没有被缓存),但它仍会加载它在缓存中找到的所有内容。
与您的问题无关的另一个注意事项是,在您的代码中,您使用了 setAppCacheMaxSize 并且在 API 18 及更高版本中已被弃用,因为 WebView 自己管理缓存大小,所以请注意这一点。
【讨论】:
您好,谢谢!我遵循了您的建议,现在我没有看到“页面无法加载错误”。我看到的是一个空白屏幕。但是在缓存目录中,我看到保存了许多文件。实际上,有一些图像文件,但我没有看到它们...... @Sargius 是的,不幸的是它不适用于每一页。这是我发现的关于它不存在的时间的答案:***.com/a/16721734/1499541 好的,非常感谢!在我看来,这个问题已经解决了 :) 我正在尝试投票,但系统告诉我不能,因为我没有足够的声誉(需要 15 个)。以上是关于如果没有连接,Android WebView 不会加载缓存的网站的主要内容,如果未能解决你的问题,请参考以下文章
android webview或浏览器不会在设备重启时删除会话cookie
如果“target=_blank”,Xamarin Android WebView 不会触发导航
特定的 webview 不会在 Android 的布局中加载
Android 仅加载缓存不起作用。离线显示 WebView