You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:48:04