Introduction à cette section :
Texte original de référence pour cette section :Android 4.4 WebView Usage Notes.md
À partir d'Android 4.4, WebView sous Android n'est plus basé sur WebKit, mais sur Chromium. Ce changement améliore considérablement les performances de WebView et offre une meilleure prise en charge de HTML5, CSS et JavaScript !
Bien que Chromium remplace complètement le précédent WebKit pour Android, l'interface de l'API WebView d'Android n'a pas changé et est entièrement compatible avec les anciennes versions. L'avantage est que les applications construites sur WebView peuvent profiter de l'efficacité et de la puissance du moteur Chromium sans aucune modification.
Pour WebView après 4.4, nous devons faire attention aux problèmes suivants :
1. Multithreading
Si vous appelez des méthodes liées à WebView dans un thread enfant au lieu du thread UI, des erreurs imprévisibles peuvent survenir. Par conséquent, lorsque votre programme doit utiliser le multithreading, veuillez également utiliser la méthode runOnUiThread() pour garantir que vos opérations sur WebView sont effectuées dans le thread UI :
runOnUiThread(newRunnable(){
@Override
publicvoid run(){
// Code for WebView goes here
}
});
2. Blocage de thread
Ne bloquez jamais le thread UI ; c'est une vérité du développement Android. Bien que ce soit une vérité, nous commettons souvent inconsciemment des erreurs qui la violent. Une erreur courante en développement consiste à attendre les callbacks JavaScript sur le thread UI. Par exemple :
// This code is BAD and will block the UI thread
webView.loadUrl("javascript:fn()");
while(result ==null) {
Thread.sleep(100);
}
Ne faites jamais cela. Android 4.4 fournit une nouvelle API pour faire cela. evaluateJavascript() est spécifiquement destinée à exécuter du code JavaScript de manière asynchrone.
3. La méthode evaluateJavascript()
Elle est spécifiquement utilisée pour appeler des méthodes JavaScript de manière asynchrone et peut obtenir un résultat de callback.
Exemple:
mWebView.evaluateJavascript(script, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//TODO
}
});
4. Gestion des redirections d'URL dans WebView
Le nouveau WebView impose des restrictions plus strictes aux redirections d'URL avec des schémas personnalisés. Lorsque vous implémentez le callback shouldOverrideUrlLoading() ou shouldInterceptRequest(), WebView ne redirigera que si l'URL de redirection est une URL légale. Par exemple, si vous utilisez une URL comme celle-ci :
<a href="showProfile.html">Show Profile</a>
shouldOverrideUrlLoading() ne sera pas appelée.
La bonne façon de l'utiliser est :
<a href="showProfile.html">Show Profile</a>
La façon correspondante de détecter les redirections d'URL :
// The URL scheme should be non-hierarchical (no trailing slashes)
privatestaticfinalString APP_SCHEME ="example-app:";
@Override
publicboolean shouldOverrideUrlLoading(WebView view,String url){
if(url.startsWith(APP_SCHEME)){
urlData =URLDecoder.decode(url.substring(APP_SCHEME.length()),"UTF-8");
respondToData(urlData);
returntrue;
}
returnfalse;
}
Bien sûr, vous pouvez aussi l'utiliser comme ceci :
webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,null,"UTF-8",null);
5. Modifications du UserAgent
Si le programme côté serveur de votre application effectue différentes actions en fonction du UserAgent envoyé par le client, vous devez noter que dans la nouvelle version de WebView, le UserAgent a subi des changements subtils :
Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16H) AppleWebKit/537.36(KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
UtilisezgetDefaultUserAgent()Vous pouvez obtenir le UserAgent par défaut avec cette méthode, ou vous pouvez utiliser :
mWebView.getSettings().setUserAgentString(ua); mWebView.getSettings().getUserAgentString();
pour définir et obtenir un UserAgent personnalisé.
6. Remarques sur l'utilisation de addJavascriptInterface()
À partir d'Android 4.2, seules les méthodes Java déclarées avec @JavascriptInterface peuvent être appelées par JavaScript. Par exemple :
class JsObject {
@JavascriptInterface
public String toString() { return "injectedObject"; }
}
webView.addJavascriptInterface(new JsObject(), "injectedObject");
webView.loadData("", "text/html", null);
webView.loadUrl("javascript:alert(injectedObject.toString())");
7.Débogage à distance
Le nouveau WebView offre également une excellente fonctionnalité : utiliser Chrome pour déboguer les programmes s'exécutant dans votre WebView. Pour plus de détails, voir :remote-debuggingPS : vous avez besoin d'un VPN~ Vous pouvez également rechercher directement remote-debugging sur Baidu pour en savoir plus et comment l'utiliser !
Résolution du problème de lecture des contacts sur le N5 depuis la section précédente :
Haha, après avoir lu ce qui précède, nous savons qu'à partir d'Android 4.2, seules les méthodes Java déclarées avec @JavascriptInterface peuvent être appelées par JavaScript. Nous avons donc ajouté @JavascriptInterface aux deux méthodes précédentes.

Mais après l'avoir ajouté, la liste de contacts que nous voulions n'est pas apparue comme prévu. Pourquoi ? En consultant le Log, nous avons trouvé le message suivant :

Cela signifie en gros : toutes les méthodes WebView doivent être appelées dans le même thread, mais la méthode contactlist ici a été appelée dans le thread JavaBridge ! Nous devons donc mettre le contenu de contactlist dans le même thread. Une solution est la suivante :

Haha, puis exécutez le programme. Par magie, nous pouvons lire les contacts sur notre téléphone N5~

De même, le premier exemple peut aussi être résolu de cette façon~
Résumé de cette section :
Dans cette section, nous avons passé en revue les points à prendre en compte pour WebView après Android 4.4, ainsi que quelques solutions au problème du N5 de la section précédente~ Je pense que cela apportera de la commodité à tout le monde lors de l'utilisation de WebView dans le développement réel~ Merci.
