不推荐使用WebViewClient onReceivedError,新版本不会检测所有错误

时间:2015-09-24 19:33:42

标签: android webview

在Android SDK中,onReceivedError(WebView view, int errorCode, String description, String failingUrl)已被弃用并替换为onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)。但是,如果我将手机置于飞行模式并在我的WebView上加载网址,则只会调用该方法的弃用版本。

onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse)也没有用,因为它只检测高于500的错误,并且我获得了109状态代码。

是否有一种不推荐的方法可以检测到我的WebView无法加载?

2 个答案:

答案 0 :(得分:122)

You could also do following:

@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    // Handle the error
}

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

Make sure you import android.annotation.TargetApi

Happy coding!

答案 1 :(得分:26)

请注意,您正在测试的移动设备需要实际运行Android Marshmallow(API 23)。即使您在API 23 SDK上开发应用程序,然后在Android Lollipop上运行应用程序,您仍然会获得“旧”onReceivedError,因为它是操作系统的功能,而不是SDK的功能。

此外,“错误代码109”(我猜这是net::ERR_ADDRESS_UNREACHABLE)不是HTTP错误代码,而是Chrome的错误代码。仅对通过HTTP从服务器收到的错误调用onReceivedHttpError。当设备处于飞行模式时,它无法从服务器接收回复。