Android webview slow

Мои андроидские веб-просмотры медленны. Это на все, от телефонов до 3.0+ планшетов с более чем адекватными характеристиками

Я знаю, что веб-просмотры должны быть «ограниченными», но я вижу, что веб-приложения, выполненные с разрывом в телефоне, должны использовать всевозможные CSS3 и JQuery колдовство, они работают просто отлично и быстро

Поэтому я что-то пропустил, есть ли какой-то myWebview.SPEEDHACK(1) который я могу использовать для ускорения работы? благодаря

Кроме того, иногда содержимое моего веб-представления просто не загружается, а не медленно загружается, оно просто не загружается. Объект, который я тестирую, хранится локально, никаких ошибок.

Solutions Collecting From Web of "Android webview slow"

Это зависит от загружаемого веб-приложения. Попробуйте следующие подходы:

Установите более высокий приоритет рендеринга (устаревший от API 18+):

 webview.getSettings().setRenderPriority(RenderPriority.HIGH); 

Включение / выключение аппаратного ускорения:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // chromium, enable hardware acceleration webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { // older android version, disable hardware acceleration webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

Отключите кеш (если у вас есть проблемы с вашим контентом):

 webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 

Добавление этого android:hardwareAccelerated="true" в манифесте было единственной вещью, которая значительно улучшила производительность для меня

Подробнее здесь: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

Решение для нас было противоположным. Мы отключили аппаратное ускорение только в WebView (а не на всем приложении в манифесте), используя этот код:

 if (Build.VERSION.SDK_INT >= 11){ webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

Теперь анимации CSS3 стали более плавными. Мы используем Android 4.0.

Подробнее здесь: https://code.google.com/p/android/issues/detail?id=17352

Я думаю, что следующее работает лучше всего:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } else { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

Android 19 имеет движок Chromium для WebView. Я думаю, это работает лучше с аппаратным ускорением.

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

Если у вас была возможность изучить события перетаскивания, немного, создав класс «MiWebView», перезаписав метод «onTouchEvent» и, по крайней мере, напечатав время, в которое происходит каждое событие перетаскивания, вы увидите, что они разделены Вовремя (до 9 м). Это очень короткое время между событиями.

Взгляните на исходный код WebView и просто посмотрите функцию onTouchEvent. Просто невозможно, чтобы процессор обрабатывался менее чем за 9 мс (продолжайте мечтать !!!). Вот почему вы постоянно видите «Miss the drag, поскольку мы ждем ответа WebCore на прикосновение». сообщение. Код просто не может быть обработан вовремя.

Как это исправить? Во-первых, вы не можете повторно написать код onTouchEvent, чтобы улучшить его, это слишком много. Но вы можете «высмеять это», чтобы ограничить скорость событий для перетаскивания, скажем, до 40 мс или 50 мс. (Это зависит от процессора).

Все события касаются следующего: ACTION_DOWN -> ACTION_MOVE …… ACTION_MOVE -> ACTION_UP. Поэтому нам нужно держать движения DOWN и UP и фильтровать скорость MOVE (это плохие парни).

И вот способ сделать это (вы можете добавить больше типов событий, таких как 2 пальца, все, что мне интересно, это прокрутка одного пальца).

 import android.content.Context; import android.view.MotionEvent; import android.webkit.WebView; public class MyWebView extends WebView{ public MyWebView(Context context) { super(context); // TODO Auto-generated constructor stub } private long lastMoveEventTime = -1; private int eventTimeInterval = 40; @Override public boolean onTouchEvent(MotionEvent ev) { long eventTime = ev.getEventTime(); int action = ev.getAction(); switch (action){ case MotionEvent.ACTION_MOVE: { if ((eventTime - lastMoveEventTime) > eventTimeInterval){ lastMoveEventTime = eventTime; return super.onTouchEvent(ev); } break; } case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_UP: { return super.onTouchEvent(ev); } } return true; } } 

Конечно, используйте этот класс вместо WebView, и вы увидите разницу при прокрутке.

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

Я пробовал все предложения по исправлению проблемы с производительностью в приложении phonegap. Но ничего не сработало.

Наконец, после целого дня поиска я сделал это. Я установил внутри тега (а не тег) моего AndroidManifest

 <application android:hardwareAccelerated="false" ... 

Теперь приложение ведет себя так же быстро, как мой веб-браузер. Похоже, если аппаратное ускорение не всегда является лучшей функцией …

Детальная проблема: https://stackoverflow.com/a/24467920/3595386

Если есть только несколько компонентов вашего веб-представления, которые являются медленными или медленными, попробуйте добавить это к элементам css:

 transform: translate3d(0,0,0); -webkit-transform: translate3d(0,0,0); 

Это была единственная скорость, которая действительно повлияла на мой веб-просмотр. Но будьте осторожны, чтобы не злоупотреблять им! (Вы можете больше узнать о взломе в этой статье .)

Ни один из этих ответов не помог мне.

Наконец, я нашел причину и решение. Причиной было множество фильтров CSS3 (фильтр, -webkit-filter).

Решение

Я добавил обнаружение WebView в сценарии веб-страницы, чтобы добавить класс «lowquality» в тело HTML. КСТАТИ. Вы можете легко отследить WebView, установив user-agent в настройках WebView. Затем я создал новое правило CSS

 body.lowquality * { filter: none !important; } 

Попробуй это:

 mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 

Если вы привязываетесь к событию onclick , это может быть медленным на сенсорных экранах.

Чтобы ускорить работу, я использую fastclick , который использует гораздо более быстрые события касания, чтобы имитировать событие click.