【问题标题】:Detecting Webview Error and Show Message检测 Webview 错误并显示消息
【发布时间】:2011-09-17 13:13:50
【问题描述】:

我想在加载 web 视图页面时显示错误消息(无连接)。这是我目前所拥有的,没有错误处理代码:

public class TrackerPage extends Activity {

    // @Override
    private WebView webview;
    private ProgressDialog progressDialog;

    private boolean error;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Get rid of the android title bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        // Set the XML layout
        setContentView(R.layout.tracker_page);

        // Bundle objectbundle = this.getIntent().getExtras();
        webview = (WebView) findViewById(R.id.tracker);

        final Activity activity = this;

        // Enable JavaScript and lets the browser go back
        webview.getSettings().setJavaScriptEnabled(true);
        webview.canGoBack();

        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            public void onLoadResource(WebView view, String url) {
                // Check to see if there is a progress dialog
                if (progressDialog == null) {
                    // If no progress dialog, make one and set message
                    progressDialog = new ProgressDialog(activity);
                    progressDialog.setMessage("Loading please wait...");
                    progressDialog.show();

                    // Hide the webview while loading
                    webview.setEnabled(false);
                }
            }

            public void onPageFinished(WebView view, String url) {
                // Page is done loading;
                // hide the progress dialog and show the webview
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                    webview.setEnabled(true);
                }
            }

        });

        // The URL that webview is loading
        webview.loadUrl("http://url.org/");
    }
}

我该怎么做?

【问题讨论】:

    标签: android user-interface error-handling webview


    【解决方案1】:

    以上所有答案均已弃用。 您应该在页面完成后使用此代码

     @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.getDescription(), Toast.LENGTH_LONG).show();
        }
    

    【讨论】:

    • 如果您的项目针对 API 级别
    • @Michael,在 API 级别 1 中引入了另一种具有不同参数的方法 - onReceivedError(WebView, int, String, String)
    • 如果没有互联网,我看到的只是“找不到网页”,并且没有调用这些回调。怎么会?另外,使用 onReceivedError 的更新 API 会更好吗?根据文档,页面上的每个组件都会调用它。当它只针对整个页面时如何检查它?
    • 是否必须同时覆盖两者才能涵盖 api 级别的两种可能性?
    • @MDjava 是的,如果您的目标 API 低于和高于 23,则必须同时覆盖两者。
    【解决方案2】:

    您已经完成了大部分工作...只需实现 onReceivedError 并处理您想要的错误。

    【讨论】:

    • 实现这个但不捕获javascript错误只有连接错误等。
    • 对于 javascript 错误,设置一个覆盖 onConsoleMessage() 的 WebChromeClient。
    【解决方案3】:

    在页面完成后添加:

        public void onReceivedError(WebView view, int errorCod,String description, String failingUrl) {
                Toast.makeText(Webform.this, "Your Internet Connection May not be active Or " + description , Toast.LENGTH_LONG).show();
            }
    

    别忘了导入android.widget.Toast;

    【讨论】:

      【解决方案4】:

      根据 API 23 Marshmallow 更新答案

      WebViewClient 错误处理

          /*
           * Added in API level 23 replacing :-
           *
           * onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
          */
          @Override
          public void onReceivedError(WebView view, WebResourceRequest request,
                  WebResourceError error) {
      
              Toast.makeText(getActivity(),
                      "WebView Error" + error.getDescription(),
                      Toast.LENGTH_SHORT).show();
      
              super.onReceivedError(view, request, error);
      
          }
      
          /*
            Added in API level 23
          */
          @Override
          public void onReceivedHttpError(WebView view,
                  WebResourceRequest request, WebResourceResponse errorResponse) {
      
              Toast.makeText(getActivity(),
                      "WebView Error" + errorResponse.getReasonPhrase(),
                      Toast.LENGTH_SHORT).show();
      
      
              super.onReceivedHttpError(view, request, errorResponse);
          }
      

      网络错误处理

              webView.loadUrl(urlToLoad);
      
              if (!isConnected(getActivity())) {
                  Toast.makeText(getActivity(), "You are offline ", Toast.LENGTH_SHORT).show();
      
              }
      
           /**
           * Check if there is any connectivity
           * 
           * @param context
           * @return is Device Connected
           */
          public static boolean isConnected(Context context) {
      
              ConnectivityManager cm = (ConnectivityManager) context
                      .getSystemService(Context.CONNECTIVITY_SERVICE);
      
              if (null != cm) {
                  NetworkInfo info = cm.getActiveNetworkInfo();
      
                  return (info != null && info.isConnected());
              }
              return false;
          }
      

      【讨论】:

        【解决方案5】:
        public class WebClient extends WebViewClient {
        
            @Override
            @TargetApi(Build.VERSION_CODES.M)
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                final Uri uri = request.getUrl();
                handleError(view, error.getErrorCode(), error.getDescription().toString(), uri);
            }
        
            @SuppressWarnings("deprecation")
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                final Uri uri = Uri.parse(failingUrl);
                handleError(view, errorCode, description, uri);
            }
        
            private void handleError(WebView view, int errorCode, String description, final Uri uri) {
                final String host = uri.getHost();// e.g. "google.com"
                final String scheme = uri.getScheme();// e.g. "https"
                // TODO: logic
            }
        }
        

        【讨论】:

          【解决方案6】:

          onReceivedError 方法句柄中如下所示

          @SuppressWarnings("deprecation")
          @Override
          public void onReceivedError(WebView view, int errorCode, String description,        String failingUrl) {
              handleError(errorCode,view);
          }
          
          @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
              onReceivedError(view, rerr.getErrorCode(),rerr.getDescription().toString(),req.getUrl().toString());
          
          }
          

          HandleError 方法如下

          public static void handleError(int errorCode, WebView view) {
              
              String message = null;
              if (errorCode == WebViewClient.ERROR_AUTHENTICATION) {
                  message = "User authentication failed on server";
              } else if (errorCode == WebViewClient.ERROR_TIMEOUT) {
                  message = "The server is taking too much time to communicate. Try again later.";
              } else if (errorCode == WebViewClient.ERROR_TOO_MANY_REQUESTS) {
                  message = "Too many requests during this load";
              } else if (errorCode == WebViewClient.ERROR_UNKNOWN) {
                  message = "Generic error";
              } else if (errorCode == WebViewClient.ERROR_BAD_URL) {
                  message = "Check entered URL..";
              } else if (errorCode == WebViewClient.ERROR_CONNECT) {
                  message = "Failed to connect to the server";
              } else if (errorCode == WebViewClient.ERROR_FAILED_SSL_HANDSHAKE) {
                  message = "Failed to perform SSL handshake";
              } else if (errorCode == WebViewClient.ERROR_HOST_LOOKUP) {
                  message = "Server or proxy hostname lookup failed";
              } else if (errorCode == WebViewClient.ERROR_PROXY_AUTHENTICATION) {
                  message = "User authentication failed on proxy";
              } else if (errorCode == WebViewClient.ERROR_REDIRECT_LOOP) {
                  message = "Too many redirects";
              } else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME) {
                  message = "Unsupported authentication scheme (not basic or digest)";
              } else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_SCHEME) {
                  message = "unsupported scheme";
              } else if (errorCode == WebViewClient.ERROR_FILE) {
                  message = "Generic file error";
              } else if (errorCode == WebViewClient.ERROR_FILE_NOT_FOUND) {
                  message = "File not found";
              } else if (errorCode == WebViewClient.ERROR_IO) {
                  message = "The server failed to communicate. Try again later.";
              }
              if (message != null) {
                  Toast.makeText(getActivity(), "" + message, Toast.LENGTH_LONG).show();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-16
            • 1970-01-01
            • 2014-11-30
            • 1970-01-01
            • 1970-01-01
            • 2017-10-19
            • 1970-01-01
            • 2012-09-07
            相关资源
            最近更新 更多