代码之家  ›  专栏  ›  技术社区  ›  Ali Ha Quang

webview中单个项目的处理错误

  •  0
  • Ali Ha Quang  · 技术社区  · 6 年前

    我有一个加载脱机HTML的webview。我的脱机HTML包含

    • 文本

    • 本地图像

    • 嵌入式视频

    一切正常,但当用户没有互联网连接时,“文本”和“图像”加载正常,但“嵌入式视频”部分显示了一个丑陋的无互联网连接错误。

    我的问题是如何处理此错误并用自己的自定义错误替换它。

    我想在html中显示所有其他内容,即使没有internet连接,但要用自定义错误消息替换嵌入的视频错误消息。

    有人知道如何做到这一点吗? 干杯

    我的webview代码

    webView.ClearCache(true);
    
    webView.ClearHistory();
    
    string HTML_DATA = "";
    
    if (File.Exists(localPath))
    
    {
    
    string HTML_LOCAL = File.ReadAllText(localPath);
    
    
    HTML_DATA =  HTML_LOCAL;
    
    }
    
    
    webView.Settings.JavaScriptEnabled = true;
    
    webView.Settings.LoadWithOverviewMode = true;
    
    webView.Settings.UseWideViewPort = true;
    
    webView.SetWebViewClient(new WebViewClientClass()); 
    
    webView.LoadDataWithBaseURL("file:///android_asset/", HTML_DATA, "text/html", "UTF-8", null);
    

    现在,结果如下

    使用internet

    enter image description here

    没有互联网

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   Elvis Xia - MSFT    6 年前

    我的问题是如何处理此错误并用自己的自定义错误替换它。

    您可以像下面的代码一样在WebViewClient中处理它,但它将用错误页替换整个WebView页面:

    public class MyClient:WebViewClient
    {
        public Context _context;
        public MyClient(Context c)
        {
            _context = c;
        }
        public override void OnReceivedError(WebView view, IWebResourceRequest request, WebResourceError error)
        {
            base.OnReceivedError(view, request, error);
            var errMsg = error.DescriptionFormatted;
            Toast.MakeText(_context, errMsg, ToastLength.Long).Show();
    
            string htmlData = $"<html><body><div align='center'>This is the description for the load fail : {errMsg}</div></body>";
    
            view.LoadUrl("about:blank");
            view.LoadDataWithBaseURL(null, htmlData, "text/html", "UTF-8", null);
            view.Invalidate();
        }
    
       ...
    

    或者,您可以在Html中处理错误,您可以定义一个与webview大小相同的错误窗口,并根据internet状态隐藏/显示它:

    <DOCTYPE>
    <html>
    <head></head>
    <body>
            <iframe id="mFrame" width="854" height="480" src="https://www.youtube.com/embed/a5GMRrEJaVo" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
            <div id="errorWindow" width="854" height="480">
                This is the div for your custom error view
            </div>
    <script>
        (function(){
            "use strict"
    
            var mIframe=document.getElementById("mFrame");
            var errorWindow=document.getElementById("errorWindow");
    
            if(navigator.onLine)
            {
                //internet available
                mIframe.hidden=false;
                errorWindow.hidden=true;
            }else
            {
                //internet not available
                mIframe.hidden=true;
                errorWindow.hidden=false;
            }
    
        })()
    </script>
    </body>
    

    注意:您必须定义以下权限才能 navigator.onLine 工作:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />