安卓APK的WebView在服务端离线时暴露地址问题如何解决
Android WebView替换默认错误页解决方案
核心实现逻辑
- 自定义
WebViewClient,重写onReceivedError方法拦截页面加载错误事件 - 拦截后屏蔽系统默认错误页,自行实现错误提示逻辑
代码示例(Kotlin)
webView.webViewClient = object : WebViewClient() { // 适配Android 6.0及以上版本 override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { super.onReceivedError(view, request, error) // 仅拦截主页面加载错误,避免子资源加载失败触发逻辑 if (request?.isForMainFrame == true) { // 方案1:展示空白页 view?.loadUrl("about:blank") // 方案2:弹出Toast提示 Toast.makeText(this@YourActivity, "当前网络异常,请稍后重试", Toast.LENGTH_SHORT).show() // 方案3:加载本地自定义错误提示页(可放入assets文件夹) // view?.loadUrl("file:///android_asset/error.html") // 方案4:直接隐藏WebView,展示布局中预先写好的通用错误提示组件 // webView.visibility = View.GONE // errorLayout.visibility = View.VISIBLE } } // 兼容Android 5.1及以下版本 override fun onReceivedError(view: WebView?, errorCode: Int, description: String?, failingUrl: String?) { super.onReceivedError(view, errorCode, description, failingUrl) view?.loadUrl("about:blank") Toast.makeText(this@YourActivity, "当前网络异常,请稍后重试", Toast.LENGTH_SHORT).show() } }
代码示例(Java)
webView.setWebViewClient(new WebViewClient() { // Android 6.0+ @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); if (request.isForMainFrame()) { view.loadUrl("about:blank"); Toast.makeText(YourActivity.this, "当前网络异常,请稍后重试", Toast.LENGTH_SHORT).show(); } } // Android 5.1及以下兼容 @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); view.loadUrl("about:blank"); Toast.makeText(YourActivity.this, "当前网络异常,请稍后重试", Toast.LENGTH_SHORT).show(); } });
注意事项
- 必须同时重写两个
onReceivedError方法,兼容不同Android系统版本,避免低版本系统依然弹出默认错误页 - 增加
isForMainFrame判断逻辑,避免页面内的图片、脚本等子资源加载失败触发错误处理逻辑,仅在主页面加载失败时执行替换操作 - 如果使用本地自定义错误页,可将html文件放入项目
src/main/assets目录下,通过file:///android_asset/xxx.html路径加载
内容的提问来源于stack exchange,提问作者Derox_b2
相关产品推荐
相关产品推荐

