web-dev-qa-db-fra.com

Améliorez les performances de WebView (devraient être les mêmes que celles du navigateur Web natif)

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

Quels paramètres de 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);
43
Hansjoerg

J'ai rencontré un problème similaire, et après un débogage intensif, le navigateur natif et le navigateur WebView semblent utiliser des caches différents.

Ce code peut être utilisé pour désactiver le cache WebView et a rendu WebView beaucoup plus rapide pour moi (mais au détriment de la non mise en cache). Notez qu'il utilise des API privées, donc en l'utilisant, vous risquez de casser le code 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);
}
17
Guypo

J'ai finalement eu la raison de Android problème de mauvaise performance de la vue Web. Remarquez l'image ci-dessous ... Il a fallu 12 secondes de OnPageStarted à OnPageFinished. Parce qu'il devrait charger CSS, javascript et ... AJAX. ..

the debug window:

Je remarque que JQuery et JQueryMobile doivent charger toutes les structures DOM en Html.Si je charge paresseusement le javascript après OnPageFinished, il devrait afficher la page plus rapidement.

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

Le code 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/pireless_javascript_lazy_loading_with_lazyload

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

after change the javascript

Maintenant, cela ne prend que 2 secondes de OnPageStarted à OnPageFinished.

J'ai publié l'article sur https://wenzhang.baidu.com/page/view?key=22fe27eabff3251f-1426227431

Mais c'était écrit en chinois :)

17
DennisZhong