Quelques considérations pour WebView après Android 4.4


Introduction à cette section :

Référence au texte original de cette section : Précautions d'utilisation de WebView dans Android 4.4.md

À partir d'Android 4.4, WebView dans Android n'est plus basé sur WebKit, mais commence à être basé sur Chromium. Les performances de WebView ont été considérablement améliorées et il prend mieux en charge HTML5, CSS et JavaScript !

Bien que Chrome ait complètement remplacé le précédent WebKit pour Android, l'interface API d'Android WebView n'a pas changé. Entièrement compatible avec les anciennes versions. L'avantage est que l'APP construite sur la base de WebView ne nécessite aucune modification. Vous pouvez profiter de l'efficacité et de la puissance du noyau chromé.

Pour WebView après 4.4, nous devons faire attention aux problèmes suivants :


1. dans un thread enfant Si vous appelez les méthodes pertinentes de WebView dans le thread d'interface utilisateur au lieu du thread d'interface utilisateur, des erreurs imprévisibles peuvent se produire. Par conséquent, lorsque vous devez utiliser le multithreading dans votre programme, veuillez également utiliser la méthode runOnUiThread() pour vous assurer que vous Les opérations WebView sont effectuées dans le thread de l'interface utilisateur :

runOnUiThread(newRunnable(){
@Override
publicvoid run(){
   // Code for WebView goes here
   }
});

2. Blocage du fil

Ne bloquez jamais le thread de l'interface utilisateur, c'est l'une des premières étapes du développement La vérité sur les programmes Android. Bien que ce soit la vérité, nous ne nous en rendons souvent pas compte Faites des erreurs qui vont à l'encontre de cela. Une erreur courante en développement consiste à attendre les rappels JavaScript dans le fil de l'interface utilisateur. Par exemple :

// This code is BAD and will block the UI thread
webView.loadUrl("javascript:fn()"); 
while(result ==null) {  
    Thread.sleep(100); 
}

Ne faites pas ça. Android 4.4 fournit une nouvelle API pour ce faire. évalueJavascript() est spécifiquement conçu pour exécuter du code JavaScript de manière asynchrone.

La méthode 3.evaluateJavascript()


est spécialement utilisée pour appeler des méthodes JavaScript de manière asynchrone et peut obtenir un résultat de rappel.

Exemple
 :

mWebView.evaluateJavascript(script, new ValueCallback() {
 @Override
 public void onReceiveValue(String value) {
      //TODO
 }
});
4. Gérer le saut d'url dans WebView


La nouvelle version de WebView est destiné à la personnalisation. Le saut d'URL du schéma a de nouvelles restrictions plus strictes. Lorsque vous implémentez les rappels ShouldOverrideUrlLoading() ou ShouldInterceptRequest(), WebView ne sautera que lorsque l'URL de saut est une URL légale. Par exemple, si vous utilisez une URL comme celle-ci :

Show Profile

shouldOverrideUrlLoading() ne sera pas appelé.

La bonne façon de l'utiliser est :

Show Profile

La manière correspondante de détecter le saut 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, il peut aussi être utilisé comme ceci :

webView.loadDataWithBaseURL("example-app://example.co.uk/", HTML_DATA,null,"UTF-8",null);

5.Changements de UserAgent


Si le programme serveur correspondant à votre application fera des choses différentes en fonction du UserAgent envoyé par le client, alors vous devez faire attention Ce qui est intéressant, c'est que dans la nouvelle version de WebView, le UserAgent a subi quelques 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

Utilisez la méthode

getDefaultUserAgent()
pour obtenir le UserAgent par défaut, ou vous pouvez pass :

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

1.png

La nouvelle version de WebView propose également une fonction très puissante : utilisez Chrome pour déboguer votre programme exécuté dans WebView Pour plus de détails, veuillez consulter : débogage à distancePS : vous avez besoin d'une échelle~ Vous pouvez également directement le débogage à distance Baidu pour en savoir plus sur les informations pertinentes et comment les utiliser !


Solution au problème de lecture des contacts N5 dans la section précédente :

Hé, après avoir lu ce qui précède, nous savons qu'après Android 4.2, il suffit d'ajouter @JavascriptInterface Seules les méthodes Java déclarées peuvent être appelées par JavaScript, nous avons donc ajouté @JavascriptInterface

2.png

aux deux méthodes précédentes. Cependant, après l'avoir ajouté, il n'y avait aucun As nous. attendu, la liste de contacts que nous voulons apparaît. Pourquoi cela ? En regardant le journal, nous avons trouvé l'information suivante :

5.png

La signification générale est : toutes les méthodes WebView doivent être appelées dans le même fil de discussion, mais la méthode liste de contacts ici existe A été appelé dans le fil de discussion JavaBridge ! Nous devons donc écrire les éléments de la liste de contacts dans le même fil de discussion, comme une solution La méthode est la suivante :

3.png

Hé, lançons le programme et constatons avec surprise que les contacts de notre téléphone portable N5 peuvent être lus~

4.png

De même, le premier exemple précédent peut également être résolu de cette manière~


Résumé de cette section :

Suivez tout le monde dans cette section Un voyage à les éléments à prendre en compte dans WebView après Android 4.4, ainsi que quelques réponses aux problèmes N5 de la section précédente La solution ~ Je pense que cela apportera de la commodité à tout le monde lors de l'utilisation de WebView dans le développement réel ~ Merci