Android Studio中WebView加载URL失败时如何加载本地自定义HTML页面
Android WebView加载用户输入URL及异常跳转本地错误页实现方案
前置准备
- 先在
AndroidManifest.xml中添加网络权限:
<!-- 网络访问权限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 若需要兼容http协议站点,添加以下属性到application节点 --> <!-- android:usesCleartextTraffic="true" -->
- 在
app/src/main目录下新建assets文件夹,把你编写好的errorpage.html放入该文件夹内。 - 提前对
urlResult做非空校验,避免空值导致加载异常。
核心代码优化
你的现有代码已经覆盖了基础逻辑,补充WebView基础配置、多版本错误回调兼容即可实现完整需求,优化后完整代码如下:
public class WebResult extends AppCompatActivity { // 标记是否已经加载错误页,避免死循环 private boolean isErrorPageLoaded = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_result); WebView webView = findViewById(R.id.webView_UrlResult); // 补充基础配置,避免正常站点加载异常 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); webView.setWebViewClient(new WebViewClient(){ // 兼容低版本系统的网络错误回调 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ if (!isErrorPageLoaded) { isErrorPageLoaded = true; webView.loadUrl("file:///android_asset/errorpage.html"); } } // 兼容高版本系统的网络错误回调 @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { if (!isErrorPageLoaded) { isErrorPageLoaded = true; webView.loadUrl("file:///android_asset/errorpage.html"); } } // 覆盖HTTP错误场景,比如404、500等服务端错误 @Override public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { super.onReceivedHttpError(view, request, errorResponse); // 仅处理主页面的错误,忽略静态资源加载错误 if (request.isForMainFrame() && !isErrorPageLoaded) { isErrorPageLoaded = true; webView.loadUrl("file:///android_asset/errorpage.html"); } } // 页面加载结束后重置状态标记 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 正常页面加载完成后重置标记,方便后续重新加载其他页面 if (!url.startsWith("file:///android_asset/")) { isErrorPageLoaded = false; } } }); // URL预处理逻辑优化,覆盖所有用户输入场景 String loadUrl; if (urlResult.startsWith("http://") || urlResult.startsWith("https://")) { loadUrl = urlResult; } else { loadUrl = "https://" + urlResult; } webView.loadUrl(loadUrl); } }
优化点说明
- URL预处理逻辑兼容了带http/https协议头、不带协议头的所有用户输入场景
- 多版本错误回调覆盖了无网络、站点不存在、服务端错误、域名被屏蔽等所有加载失败场景
- 增加错误页加载标记,避免错误页本身加载失败触发反复回调的死循环问题
- 仅处理主页面加载错误,不会因为页面内的图片、JS等静态资源加载失败就跳错误页
内容的提问来源于stack exchange,提问作者Brian McCanaugh
相关产品推荐
相关产品推荐

