首页 > 解决方案 > onReceivedError 在 android Marshmallow 及以下版本中不起作用

问题描述

我正在尝试使用显示自定义错误页面onReceivedError,但未显示错误。仅在默认网页上显示的 HTML 不可用错误

    webView.setWebViewClient(new WebViewClient(){

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
                webView.loadUrl("file:///android_asset/error.html");
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon){
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url){
                swipeRefreshLayout.setRefreshing(false);
                super.onPageFinished(view,url);
                progressBar.setVisibility(View.GONE);
            }
        });

error.html 文件是

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="text-align:center;font-size:16px;">
<img src="05.png" width="100%">
<div>
    <p>Please Check your internet Connection</p>
    <p>Please Check Wifi</p>
    <p>There is no response from server</p>
</div>
<button style="background-color:#3700B3;color:#fff;border:0;border-radius:5px;padding:7px 15px;" onclick="Reload();">Try Again</button>
<script>
    function Reload(){
     location.reload();
    }
</script>
</body>
</html>

我该如何解决这个问题,请指导我。谢谢。

标签: androidwebview

解决方案


这个问题已经存在了很长时间,可能您已经得到了答案。但是作为新手爱好者,我会尝试回答您的问题,以帮助其他可能面临与您相同问题的新手。

你的代码实际上已经很好了。只有一个小问题。始终仅在 onPageFinished 之后调用 onReceivedError。永远不要在 onPageFinished 之前调用 onReceivedError。

您可能还想调用 onReceivedHttpError 以确保所有错误都由您的 html 资产处理。

所以你的代码应该如下。

webView.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon){
                super.onPageStarted(view, url, favicon);
            }

            @Override
            public void onPageFinished(WebView view, String url){
                swipeRefreshLayout.setRefreshing(false);
                super.onPageFinished(view,url);
                progressBar.setVisibility(View.GONE);
            }
            
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, 
                                        WebResourceError error){
                webView.loadUrl("file:///android_asset/error.html");
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request,
                                            WebResourceResponse errorResponse) {
                webView.loadUrl("file:///android_asset/error.html");
                super.onReceivedHttpError(view, request, errorResponse);
            }
});

推荐阅读