2011-02-14 93 views
29

有谁知道是否有方法在WebView中拦截“未找到页面”或“页面未加载错误”?Android WebView onReceivedError()

根据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 
} 

回答

29

根据文档和我的经验,它应该工作相当精细。 您只需在WebView中将覆盖方法onReceivedError设置为WebClient即可。

这里是我的一些旧的测试应用程序的代码片段:

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

我测试过它和它的作品相当精细。检查你的日志,看看你得到什么样的代码错误。 希望它有帮助。

+0

我想要做的是让它做错误别的事情, super.onReceivedError(查看使用, errorCode,description,failingUrl); myWebView.LoadUrl(“www.someOtherSite.net”); 但它没有做任何事情,但给我的“未找到”错误页面。 – 2011-02-15 03:49:20

10

我已经尝试在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中,但在overloadurlthingy方法之外。这似乎始终防止愚蠢的,傻笑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+应用的方式并不重要。而不是Google服务的方式。我坦率地说,不介意使用这些应用程序中的一小部分氧气。叫我一个坏男孩...

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