WebView加载网页不显示图片解决办法

本文介绍了在使用WebView加载网页时遇到图片无法显示的问题,并详细解释了解决方案,尤其是在Android 5.0及以上版本中如何通过设置MixedContentMode来正确加载HTTP资源。

对于大家来讲WebView肯定很熟悉,因为我们在日常开发中经常用到它。所以对于它的一些基本用法我就不在这啰嗦了,直接进入正题。

我遇到的问题就是在使用WebView加载网页的时候图片不显示(我手机系统是5.1.1),当时出现这个问题我就想当然的以为,是不是给WebView少设置的什么东西。然后百度一下:
mWebview.getSettings().setJavaScriptEnabled(true);//启用js
mWebview.getSettings().setBlockNetworkImage(false);//解决图片不显示

然后我检查了自己代码,这两句话也明明加了啊,这到底是什么鬼。后面我也加过其它的一些设置,依然没有用。难道是我的访问路径有问题吗,于是我随便找了带图片的网页,使用WebView加载了一下,哎呦我擦,图片显示没毛病啊。看来还真是我的访问路径有问题啊,但是别的都显示没问题,为什么就图片不显示呢。我跟踪断点把访问的路径复制了出来一看,我靠原来访问路径是https的呀。于是我就把矛头指向了https,简单来说,https就是http的安全版,它在http的基础上加入了ssl层。https协议在使用的时候需要申请一个安全证书,我就想是不是安全证书有问题,回头一想假如安全证书有问题,页面应该是直接显示空白才对。问题又出在哪,于是我把网页路径复制到了浏览器打开,然后查看了一下网页源码,发现图片的引用是http的,问题会不会就出在这呢。果然不出所料:


if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);


于是在设置WebView的时候加上了这句话,果然问题解决了。在5.0以下的系统即使不加这句话,图片也可以正常显示,亲测有效。

网页加载过慢是 Android 开发中常见的问题,尤其是在使用 `WebView` 加载远程网页时。以下是一些优化 `WebView` 加载速度的常见方法和解决方案。 --- ## ✅ 1. 启用缓存策略 合理使用缓存可以显著提升加载速度,尤其是对于重复访问的页面。 ```java WebSettings webSettings = webView.getSettings(); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 使用默认缓存策略 ``` ### 可选值说明: - `LOAD_DEFAULT`: 根据缓存策略自动决定是否使用缓存。 - `LOAD_CACHE_ELSE_NETWORK`: 优先使用缓存,即使缓存过期,没有缓存时才请求网络。 - `LOAD_NO_CACHE`: 使用缓存。 - `LOAD_CACHE_ONLY`: 仅使用缓存,请求网络。 --- ## ✅ 2. 启用预加载和离线加载支持 ```java webSettings.setAppCacheEnabled(true); webSettings.setAppCachePath(getCacheDir().getPath()); webSettings.setDatabaseEnabled(true); webSettings.setDomStorageEnabled(true); ``` 这些设置可以让你的 WebView 支持 HTML5 的本地存储和应用缓存,从而提升加载速度。 --- ## ✅ 3. 启用硬件加速(在 Android 4.0+) 在 `AndroidManifest.xml` 中为你的 Activity 启用硬件加速: ```xml <activity android:name=".MainActivity3" android:hardwareAccelerated="true" /> ``` 这会利用 GPU 加速渲染,提高 WebView 的绘制效率。 --- ## ✅ 4. 使用 `onPageStarted` 和 `onPageFinished` 显示加载进度 添加一个进度条让用户感知加载状态,提高用户体验: ```java webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // 更新进度条 progressBar.setProgress(newProgress); if (newProgress == 100) { progressBar.setVisibility(View.GONE); } } }); ``` --- ## ✅ 5. 使用 `shouldInterceptRequest` 拦截资源请求(高级) 你可以拦截 WebView 的资源请求,使用 OkHttp 等更快的网络库来加载资源。 ```java webView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (url.contains(".js") || url.contains(".css") || url.contains(".png")) { try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(url).build(); Response response = client.newCall(request).execute(); if (response.isSuccessful()) { ResponseBody body = response.body(); if (body != null) { return new WebResourceResponse( "text/javascript", // MIME type "UTF-8", body.byteStream() ); } } } catch (IOException e) { e.printStackTrace(); } } return super.shouldInterceptRequest(view, url); } }); ``` ⚠️ 注意:这种方式对性能有影响,建议只拦截关键资源。 --- ## ✅ 6. 使用 `evaluateJavascript` 延迟加载非关键内容 如果网页中包含大量图片或视频,可以在页面加载完成后通过 JS 延迟加载这些资源。 ```java webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } }); ``` --- ## ✅ 7. 使用 CDN 加速网页资源 如果你控制网页服务器,建议使用 CDN 来加速资源加载,减少用户请求延迟。 --- ## ✅ 8. 使用 WebView 的预加载策略(进阶) 你可以在后台提前加载 WebView,比如在 Splash 页中创建并加载 WebView,等主页面需要时直接显示。 --- ## ✅ 示例优化后的 `SetUpTheWebPage()` 方法 ```java private void SetUpTheWebPage() { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setDomStorageEnabled(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webSettings.setAppCacheEnabled(true); webSettings.setAppCachePath(getCacheDir().getPath()); webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH); webSettings.setJavaScriptCanOpenWindowsAutomatically(false); webSettings.setSupportMultipleWindows(false); webSettings.setBuiltInZoomControls(false); webSettings.setDisplayZoomControls(false); webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // 更新进度条或加载状态 } }); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { webView.evaluateJavascript("document.querySelectorAll('img').forEach(img => img.loading = 'lazy');", null); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } }); if (value.equals("0")) { url = "http://192.168.2.36:8088/#/electrStation/greenTemp"; } else if (value.equals("1")) { url = "http://some-other-url.com"; } webView.loadUrl(url); } ``` --- ## ✅ 总结 | 优化方法 | 说明 | |----------|------| | 启用缓存 | 提升重复访问速度 | | 硬件加速 | 提升渲染性能 | | 预加载资源 | 减少用户等待时间 | | 进度条 | 提升用户体验 | | 拦截资源请求 | 使用 OkHttp 等高效库加载资源 | | 延迟加载图片 | 减少初始加载时间 | --- ###
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值