【问题标题】:Android WebView onReceivedError()Android WebView onReceivedError()
【发布时间】:2019-03-01 18:07:47
【问题描述】:

有没有人知道有没有办法在 WebView 中拦截“页面未找到”或“页面未加载错误”?

根据android文档,onReceivedError()应该可以拦截。但我在一个应用程序中测试了它,我故意给出了错误的 URL,它没有做任何事情。

如果 URL 由于任何原因不可用,我希望我的应用能够提供我自己的自定义错误消息。

这是什么都没做的代码:

public void onReceivedError(WebView view, int errorCode,
        String description, String failingUrl) {

    // custom error handling ... show and alert or toast or something
}

【问题讨论】:

    标签: android webview


    【解决方案1】:

    根据文档和我的经验,它应该可以正常工作。 您只需在 WebView 中使用覆盖方法 onReceivedError 设置您的 WebClient

    这是我的一些旧测试应用程序的 sn-p:

     WebView wv = (WebView) findViewById(R.id.webView);
     wv.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Log.i("WEB_VIEW_TEST", "error code:" + errorCode);
                super.onReceivedError(view, errorCode, description, failingUrl);
        }
     });
    

    我已经测试过了,它工作得很好。检查你的日志,看看你得到什么样的代码错误。 希望对您有所帮助。

    【讨论】:

    • 我想做的是让它在出错时做其他事情,super.onReceivedError(view, errorCode, description, failedUrl); myWebView.LoadUrl("www.someOtherSite.net");但它什么也没做,只是给了我“未找到”错误页面。
    • 这个小窗口的代码太多了。但我使用了您上面显示的代码示例。
    • 您可以尝试在“onReceivedError”中使用“loadData(...)”方法加载一些替代页面。它应该快速切换错误页面的内容...
    • 似乎这个方法只在加载错误(如超时)时调用,而不是在 404 错误时调用。 (在这种情况下,页面成功加载,只是状态不是 200 OK)
    • onReceivedError 在 API 23 中已弃用。使用 public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)
    【解决方案2】:

    我尝试在 shouldOverrideUrlLoading() 内部和该方法外部但在 WebViewClient 中使用 onReceivedError。我什至在主 Activity 类中尝试过。我对不一致的结果不满意。所以我决定使用一个测试方法 isOnline(),并在调用 loadUrl() 之前调用它。

    public boolean isOnline() {
        ConnectivityManager cm = (ConnectivityManager) getBaseContext()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
    
        NetworkInfo i = cm.getActiveNetworkInfo();
        if ((i == null) || (!i.isConnected())) {
            Toast toast = Toast.makeText(getBaseContext(),
                    "Error: No connection to Internet", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
            toast.show();
            return false;
        }
        return true;
    }
    

    那么这个 onReceivedError 是在 WebViewClient 中但在重载urlthingy 方法之外。这似乎始终可以防止愚蠢的、傻笑的 android 错误页面。

        @Override
        public void onReceivedError(WebView view, int errorCode,
                String description, String failingUrl) {
            if (view.canGoBack()) {
                view.goBack();
            }
            Toast toast = Toast.makeText(getBaseContext(), description,
                    Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
            toast.show();
        }
    

    有些人可能会认为这种资源很重。好吧,不像 Android Facebook 和 Google+ 应用程序那样沉重。而不是谷歌服务的方式。坦率地说,我不介意用掉这些应用程序中的一些氧气。叫我坏孩子……

    【讨论】:

      【解决方案3】:

      你应该在页面完成后使用它

       @Override
          public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
                 //Your code to do
              Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error , Toast.LENGTH_LONG).show();
          }
      

      【讨论】:

        【解决方案4】:

        请记住使用这两个 onReceivedError 方法,因为不推荐使用带有 description 参数的方法。我们使用这种不推荐使用的方法来支持 API 23 以下。因此我们可以在所有 SDK 版本中使用它。

        我是怎么做的 -

           webview.setWebViewClient(new WebViewClient() {
        
        
                @SuppressWarnings("deprecation")
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        
                    try {
                        webview.stopLoading();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (webview.canGoBack()) {
                        webview.goBack();
                    }
        
                    showkError();
                }
        
                @TargetApi(android.os.Build.VERSION_CODES.M)
                @Override
                public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
                    // Redirect to deprecated method, so you can use it in all SDK versions
                    try {
                        webview.stopLoading();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (webview.canGoBack()) {
                        webview.goBack();
                    }
        
                    showError();
                }
        
                @Override
                public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                    super.onReceivedHttpError(view, request, errorResponse);
        
                    try {
                        webview.stopLoading();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    if (webview.canGoBack()) {
                        webview.goBack();
                    }
        
                    showError();
                }
          });
        

        【讨论】:

        • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
        • 其实,我的语法水平比很多开发者都差。我怕在这里写错什么。但我正在提高我的语法。
        猜你喜欢
        • 2023-03-23
        • 2014-10-29
        • 2017-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        相关资源
        最近更新 更多