处理webview中各个项目的错误

时间:2018-03-23 01:56:22

标签: android xamarin.android android-webview

我有一个加载离线HTML的webview。我的离线HTML包含

  • 文本

  • 本地图片

  • 嵌入式视频

一切正常但是当用户没有互联网连接时,'text'和'images'加载正常,但'嵌入视频'部分显示一个丑陋的NO INTERNET CONNECTION错误。

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

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

任何人都知道如何实现这一目标? 干杯

我的网页视图代码

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);

现在结果如下

  

使用互联网

enter image description here

  

没有互联网

enter image description here

1 个答案:

答案 0 :(得分:0)

  

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

您可以在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相同大小的错误窗口,并根据互联网状态隐藏/显示它:

<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" />