Повысьте производительность 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
Но это было написано по-китайски:)