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

Mar*_*psz 51 android webview

在Android SDK 23中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无法加载?

xde*_*s23 126

您还可以执行以下操作:

@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());
}
Run Code Online (Sandbox Code Playgroud)

确保导入 android.annotation.TargetApi

快乐的编码!

  • 请注意,将针对无法加载的任何资源(iframe,图像等)调用新的SDK 23回调,而不仅仅是主页...因此,您可能需要相应地修改错误处理. (8认同)
  • @ShahidSarwar试图发布并发布,现在是什么? (3认同)
  • 这个有效!30.11.2015,在android 4x上,最新的sdk为5x (2认同)
  • @ShahidSarwar这是错的!您遇到的问题与此问题中讨论的代码无关.`onReceivedSslError`回调和你在那里做的是一个完全不同的主题. (2认同)
  • @ShahidSarwar:对不起,您在此处分享的链接是一个不同的主题,并且在此上下文中没有任何相关性.问那里的人使用'handler.proceed()'; 盲目地对'onReceivedSslError'回调.这就是谷歌拒绝它的原因,我也曾遇到过同样的情况.无论如何,xdevs23的答案是最好的,至少目前是这样. (2认同)

Mik*_*nov 27

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

此外,"错误代码109"(我猜,这是net::ERR_ADDRESS_UNREACHABLE)不是HTTP错误代码,它是Chrome的错误代码.onReceivedHttpError只调用通过HTTP从服务器收到的错误.当设备处于飞行模式时,它不可能从服务器接收回复.

  • 这怎么可能是答案..它没有给出解决方案 (7认同)