WebViewClient onReceivedError deprecated, new version does not detect all errors
在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上运行该应用程序,您仍然会得到" old " onReceivedError,因为它是操作系统的功能,而不是SDK的功能。另外,"错误代码109"(我想这是net :: ERR_ADDRESS_UNREACHABLE)不是HTTP错误代码,而是Chrome的错误代码。仅针对通过HTTP从服务器收到的错误调用onReceivedHttpError。当设备处于飞行模式时,它可能无法收到来自服务器的回复。
-
@MikhailNaganov很有帮助。如果您将其发布为答案,我会接受。
-
@MartinEpsz很高兴它有所帮助!作为答案发布。
-
因此,解决方案是在客户端中覆盖这两种方法,我希望操作系统可以确定调用哪一种方法。
-
@MikhailNaganov等待,这是否意味着如果该应用程序的目标API <23但在> 23上运行,则旧的onReceivedError将无法正常工作?因为这似乎是错误的-如果API不支持新代码,您将如何获得呢?
-
@Michael会的。看一下源代码:android.googlesource.com/platform/frameworks/base.git/ / mast ?? er / ...如果应用程序没有使onReceivedError的新版本超载,则WebViewClient中的默认实现将调用它。
您还可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12
| @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为5x
-
请注意,新的SDK 23回调将针对无法加载的任何资源(iframe,图像等)调用,而不仅仅是针对主页...因此,您对错误的处理可能需要相应地进行修改。
-
是的,我想用户可以用自己的方式来处理它,它可能会有所不同,具体取决于您使用它的目的。
-
@TargetApi是否也适用于新的api,例如24吗?它会覆盖所有API> = 23或仅API = 23的onReceivedError吗?
-
它应该覆盖> = 23 @ Lucker10
-
重定向不危险吗?
-
不,这不对。至少不是现在。
-
重要说明:Google不允许您在Playstore中上传使用上述代码的apk ...避免使用上述代码。
-
为什么 ? @Shahid Sarwar
-
我最近使用上面的代码发布了我的代码,但是Google拒绝了它。.他们不再允许直接或间接使用onReceivedError(),而必须使用onReceivedSslError()方法:请参阅此链接stackoverflow.com/questions/36050741 /…寻求适当的解决方案。其他任何解决方案都将无法使用。
-
@ShahidSarwar错了!您遇到的问题与该问题中讨论的代码无关。 onReceivedSslError回调与您所做的事情完全不同。
-
@caw尝试使用onReceivedError()而不是onReceivedSslError()发布应用程序,您将了解我的意思。
-
谢谢(你的)信息! @ShahidSarwar
-
@ShahidSarwar尝试发布,并被发布了,现在怎么办?
-
也许他们发现这可能是必要的。
-
@ShahidSarwar:抱歉,您在此处共享的链接是一个不同的主题,并且在此上下文中没有任何关联。在那里问这个问题的人使用了'handler.proceed()';盲目地在" onReceivedSslError"回调上。这就是Google拒绝它的原因,而我也遇到过同样的情况。无论如何,xdevs23给出的答案暂时是最好的,至少是最好的。
-
您必须访问stackoverflow.com/q/44068123/6120487才能正确使用此方法!
请注意,您要测试的移动设备需要实际运行Android Marshmallow(API 23)。即使您使用API?? 23 SDK开发应用程序,然后在Android Lollipop上运行该应用程序,您仍然会得到"旧" onReceivedError,因为它是操作系统的功能,而不是SDK的功能。
此外,"错误代码109"(我想这是net::ERR_ADDRESS_UNREACHABLE)不是HTTP错误代码,而是Chrome的错误代码。仅针对通过HTTP从服务器收到的错误调用onReceivedHttpError。当设备处于飞行模式时,它可能无法收到来自服务器的回复。
- 这怎么可能是答案..它没有给出解决方案
-
解决方案是使用运行> = 23的设备