有没有人知道是否有办法拦截WebView中的“找不到页面”或“页面未加载错误”?
根据android文档,onReceivedError()
应该能够拦截。但我在一个应用程序测试它,我删除了错误的URL,它没有做任何事情。
如果网址因任何原因无法使用,我希望我的应用能够提供自己的自定义错误消息。
这是没有做任何事情的代码:
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
// custom error handling ... show and alert or toast or something
}
答案 0 :(得分:29)
根据文档和我的经验,它应该工作得很好。
您只需在WebView中使用覆盖方法WebClient
设置onReceivedError
。
以下是我的一些旧测试应用的片段:
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);
}
});
我测试了它并且它工作得很好。检查您的日志,看看你得到了什么样的代码错误。 希望它有所帮助。
答案 1 :(得分:11)
我已尝试在shouldOverrideUrlLoading()内部和该方法之外使用onReceivedError但在WebViewClient中。我甚至在主要的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+应用程序那么重。而不是谷歌服务的方式。坦率地说,我不介意使用那些应用程序氧气。叫我一个坏孩子......
答案 2 :(得分:2)
你应该在页面完成后使用它
@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();
}
答案 3 :(得分:0)
请记住同时使用两个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();
}
});