【问题标题】:WebViewClient onReceivedError deprecated, new version does not detect all errorsWebViewClient onReceivedError 已弃用,新版本未检测到所有错误
【发布时间】:2015-09-24 19:33:41
【问题描述】:

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

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

是否有一种不被弃用的方法来检测我的 WebView 无法加载?

【问题讨论】:

  • 确保您正在使用 Android SDK 23 进行测试
  • @KaranMer,已经是这样了。
  • 您正在测试的移动设备是否实际运行 Android Marshmallow (API 23)?即使您在 API 23 SDK 上开发您的应用程序,然后在 Android Lollipop 上运行该应用程序,您仍然会得到“旧的”onReceivedError,因为它是操作系统的功能,而不是 SDK 的功能。此外,“错误代码 109”(我猜,这是 net::ERR_ADDRESS_UNREACHABLE)不是 HTTP 错误代码,而是 Chrome 的错误代码。 onReceivedHttpError 仅针对通过 HTTP 从服务器接收到的错误调用。当设备处于飞行模式时,它不可能收到来自服务器的回复。
  • @MikhailNaganov 这很有帮助。如果您将其发布为答案,我会接受。
  • 所以解决方案是覆盖客户端中的这两种方法,并期望操作系统确定调用哪个方法,我猜。

标签: android webview


【解决方案1】:

您还可以执行以下操作:

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

确保导入android.annotation.TargetApi

【讨论】:

  • 这行得通! 30.11.2015 ,在 android 4x 上,带有最新的 sdk for 5x
  • 请注意,新的 SDK 23 回调将被调用用于任何未能加载的资源(iframe、图像等),而不仅仅是主页......因此您对错误的处理可能需要相应修改。
  • @ShahidSarwar 错了!您遇到的问题与此问题中讨论的代码无关。 onReceivedSslError 回调和你在那里所做的完全不同。
  • @ShahidSarwar 尝试发布并发布,现在怎么办?
  • @ShahidSarwar :抱歉,您在此处分享的链接是一个不同的主题,在此上下文中没有任何相关性。在那里提出问题的人使用了“handler.proceed()”;盲目地使用“onReceivedSslError”回调。这就是谷歌拒绝它的原因,我也遇到过同样的情况。无论如何,xdevs23 的答案是最好的,至少目前是最好的。
【解决方案2】:

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

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

【讨论】:

  • 这怎么可能是答案.. 它没有给出解决方案
  • 解决方法是使用运行>=23的设备
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多