Повысьте производительность webView (должна быть такая же производительность, что и собственный веб-браузер)

Мой опыт заключается в том, что загрузка веб-сайтов в WebView намного медленнее, чем выполнение тех же действий в веб-браузере Android. Я вижу, что все файлы загружены в мой Apache-журнал, это займет несколько секунд, пока страница не будет отображаться в элементе управления WebView. Открытие одной и той же страницы в собственном веб-браузере приведет к немедленному отображению. Кажется, что рендеринг каким-то образом искалечен.

Какие настройки браузера мы должны применять для достижения такой же производительности, как и загрузка страницы в собственном веб-браузере?

Наши текущие настройки:

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);

Ответ 1

У меня возникла аналогичная проблема, и после некоторой тяжелой отладки заметил, что собственный браузер и браузер WebView используют разные кеши.

Этот код можно использовать для отключения кэша WebView и сделать WebView намного быстрее для меня (хотя и за счет кэширования). Обратите внимание, что он использует частные API, поэтому, используя его, вы рискуете, что код будет разбит в будущих выпусках:

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

Ответ 2

Наконец-то я получил причину плохой производительности Android-браузера. Обратите внимание на изображение ниже... Он использовал 12 секунд от OnPageStarted до OnPageFinished. Потому что он должен загружать CSS, javascript и... AJAX...

the debug window:

Я замечаю, что JQuery и JQueryMobile загружают всю структуру DOM в Html. Так что, если я lazy загружаю javascript после OnPageFinished, он должен показывать страницу быстрее.

Сначала используйте setTimeout вместо $(document).ready(function() {}); в JQuery. Затем используйте lazyload javascript файл.

Последний html и javascript:

<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>

Вы можете найти lazyload-min.js в http://wonko.com/post/painless_javascript_lazy_loading_with_lazyload

После этого вы можете увидеть изображение журнала ниже:

after change the javascript

Теперь он занимает всего 2 секунды от OnPageStarted до OnPageFinished.

Я опубликовал статью в https://wenzhang.baidu.com/page/view?key=22fe27eabff3251f-1426227431

Но это было написано по-китайски:)