web-dev-qa-db-fra.com

WebViewClient onReceivedError obsolète, la nouvelle version ne détecte pas toutes les erreurs

Dans le Android SDK 23 onReceivedError(WebView view, int errorCode, String description, String failingUrl)) est obsolète et remplacé par onReceivedError(WebView view, WebResourceRequest request, WebResourceError error). Toutefois, si je mets mon téléphone en mode Avion et charge une URL sur mon WebView, seule la version obsolète de la méthode est appelée.

onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) n'est pas non plus utile, car il ne détecte que les erreurs supérieures à 500, et je reçois un code d'état 109.

Existe-t-il un moyen non déconseillé de détecter l'échec du chargement de ma WebView?

49
Martin Epsz

Notez que le périphérique mobile sur lequel vous testez doit réellement exécuter Android Marshmallow (API 23). Même si vous développez votre application sur le kit de développement API 23 SDK, puis exécutez-la sur Android Lollipop, vous aurez toujours le "vieux" onReceivedError, car il s’agit de la fonctionnalité du système d’exploitation, et non d’un SDK.

En outre, le "code d'erreur 109" (je suppose, c'est net::ERR_ADDRESS_UNREACHABLE) n'est pas un code d'erreur HTTP, c'est le code d'erreur de Chrome. onReceivedHttpError n'est appelé que pour les erreurs reçues du serveur via HTTP. Lorsque l'appareil est en mode avion, il ne peut éventuellement pas recevoir de réponse d'un serveur.

26
Mikhail Naganov

Vous pouvez également faire ce qui suit:

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

Assurez-vous d'importer Android.annotation.TargetApi

Bonne codage!

125
xdevs23