43 votes

Améliorer les performances du webView (les performances devraient être les mêmes que celles du navigateur Web natif).

D'après mon expérience, le chargement des sites Web dans une WebView est beaucoup plus lent que l'exécution des mêmes actions dans le navigateur Web d'Android. Je peux voir que tous les fichiers ont été chargés dans mon journal Apache, mais il faut quelques secondes pour que la page s'affiche dans le contrôle WebView. L'ouverture de la même page dans le navigateur Web natif entraîne un affichage immédiat. Il semble que le rendu soit en quelque sorte handicapé.

Quels paramètres du navigateur devons-nous appliquer pour obtenir les mêmes performances que le chargement de la page dans le navigateur Web natif ?

Nos paramètres actuels :

browserset.setLoadsImagesAutomatically(true);
browserset.setJavaScriptEnabled(true);
browserset.setDatabaseEnabled(true);
browserset.setDatabasePath("data/data/com.xxx/databases");
browserset.setDomStorageEnabled(true);
browserset.setRenderPriority(WebSettings.RenderPriority.HIGH);
browserset.setSupportZoom(false);
browserset.setUserAgentString( browserset.getUserAgentString() + " (XY ClientApp)" );
browserset.setAllowFileAccess(true);
browserset.setSavePassword(false);
browserset.setSupportMultipleWindows(false);
browserset.setAppCacheEnabled(true);
browserset.setAppCachePath("");
browserset.setAppCacheMaxSize(5*1024*1024);

17voto

Guypo Points 139

J'ai rencontré un problème similaire, et après quelques débogages importants, j'ai remarqué que le navigateur natif et le navigateur WebView semblent utiliser des caches différents.

Ce code peut être utilisé pour désactiver le cache de WebView, et a rendu WebView beaucoup plus rapide pour moi (bien qu'au détriment de l'absence de cache). Notez qu'il utilise des APIs privées, donc en l'utilisant vous prenez le risque que le code se casse dans les futures versions :

try
{
  Method m = CacheManager.class.getDeclaredMethod("setCacheDisabled", boolean.class);
  m.setAccessible(true);
  m.invoke(null, true);
}
catch (Throwable e)
{
  Log.i("myapp","Reflection failed", e);
}

17voto

DennisZhong Points 181

J'ai finalement trouvé la raison de la mauvaise performance de Android webview. Remarquez l'image ci-dessous... Il a fallu 12 secondes entre OnPageStarted et OnPageFinished. Parce qu'il doit charger CSS, javascript et ... AJAX...

the debug window:

J'ai remarqué que JQuery et JQueryMobile ont besoin de charger toutes les structures DOM en Html, donc si je charge paresseusement le javascript après OnPageFinished, la page devrait s'afficher plus rapidement.

Utilisez d'abord setTimeout au lieu de $(document).ready(function() {}) ; dans JQuery, puis utilisez le fichier javascript lazyload.

Le html et javascript final est :

<script src="/css/j/lazyload-min.js" type="text/javascript"></script>

        <script type="text/javascript" charset="utf-8"> 

       loadComplete(){

          //instead of $(document).ready(function() {});

       }

        function loadscript()

        {

LazyLoad.loadOnce([

 '/css/j/jquery-1.6.2.min.js',

 '/css/j/flow/jquery.flow.1.1.min.js',  

 '/css/j/min.js?v=2011100852'

], loadComplete);

        }

        setTimeout(loadscript,10);

        </script>

Vous pouvez trouver lazyload-min.js dans http://wonko.com/post/painless_javascript_lazy_loading_with_lazyload

Après avoir fait cela, vous pouvez voir l'image du journal ci-dessous :

after change the javascript

Maintenant, il ne faut que 2 secondes entre OnPageStarted et OnPageFinished.

J'ai posté l'article à http://hi.baidu.com/goldchocobo/blog/item/5009ed1b40925ce4ae5133ee.html?timeStamp=1326860583547 Mais c'était écrit en chinois :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X