Android webview slow
Мои android webviews
медленны. Это на все, от телефонов до 3.0+
планшетов с более чем адекватными характеристиками
Я знаю, что веб-просмотры должны быть «ограниченными», но я вижу, что веб-приложения сделаны с разрывом в телефоне, которые должны использовать всевозможные CSS3
и JQuery
колдовство, они работают просто отлично и быстро
поэтому я что-то пропустил, есть ли какой-то myWebview.SPEEDHACK(1)
который я могу использовать для ускорения работы?
- Является ли оператор неравенства быстрее, чем оператор равенства?
- Производительность массивов против списков
- Как выбрать размер сетки и блока для ядер CUDA?
- Как профилировать использование памяти и производительность с помощью инструментов?
- Как я могу профилировать приложение для Android?
также, иногда содержимое моего веб-браузера просто просто не загружается, а не медленно загружается, оно просто не загружается. Объект, который я тестирую, хранится локально, без ошибок.
- Оптимизация производительности Java HashMap
- Как я могу ускорить запрос MySQL с большим смещением в предложении LIMIT?
- LINQ Ring: Any () vs Содержит () для огромных коллекций
- Можно использовать профилировщик, но почему бы не просто остановить программу?
- Как написать код, который лучше всего использует кеш процессора для повышения производительности?
- Производительность сериализации C ++
- Эффективное умножение векторных матриц 4x4 на SSE: горизонтальное добавление и точечный продукт - в чем смысл?
- Неизвестные события в nodejs / v8 flashgraph с использованием perf_events
Это зависит от загружаемого веб-приложения. Попробуйте следующие подходы:
Установите более высокий приоритет рендеринга (устаревший от 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
У меня была такая же проблема, и мне пришлось ее решить. Я пробовал эти решения, но в конце производительность, по крайней мере, для прокрутки не улучшилась вообще. Итак, вот работа, которую я сделал, и объяснение того, почему это сработало для меня.
Если у вас была возможность изучить события перетаскивания, немного, создав class «MiWebView», перезаписав метод «onTouchEvent» и, по крайней мере, напечатав время, в которое происходит каждое событие перетаскивания, вы увидите, что они разделены вовремя (до 9 м). Это очень короткое время между событиями.
Взгляните на исходный код WebView и просто просмотрите функцию onTouchEvent. Это просто невозможно, чтобы процессор обрабатывался менее чем за 9 мс (продолжайте мечтать !!!). Вот почему вы постоянно видите «Miss 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; } }
Конечно, используйте этот class вместо WebView, и вы увидите разницу при прокрутке.
Это всего лишь подход к решению, но все еще не полностью реализованный для всех случаев ожидания из-за касания экрана при использовании WebView. Однако это лучшее решение, которое я нашел, по крайней мере, для моих конкретных потребностей.
Я думаю, что следующее работает лучше всего:
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. Я думаю, что он работает лучше с аппаратным ускорением.
Я пробовал все предложения по исправлению проблемы с производительностью в приложении phonegap. Но ничего не получилось.
Наконец, после целого дня поиска я сделал это. Я установил внутри тега (а не тег) моего AndroidManifest
Теперь приложение ведет себя так же быстро, как мой веб-браузер. Похоже, если аппаратное ускорение не всегда является лучшей функцией ...
Детальная проблема: https://stackoverflow.com/a/24467920/3595386
Если есть несколько компонентов вашего веб-представления, которые являются медленными или медленными, попробуйте добавить это к элементам css:
transform: translate3d(0,0,0); -webkit-transform: translate3d(0,0,0);
Это была единственная скорость, которая действительно повлияла на мой веб-просмотр. Но будьте осторожны, чтобы не злоупотреблять им! (вы можете больше узнать о взломе в этой статье .)
Ни один из этих ответов не помог мне.
Наконец, я нашел причину и решение. Причиной было множество фильтров CSS3 (фильтр, -webkit-filter).
Решение
Я добавил обнаружение WebView в сценарии веб-страницы, чтобы добавить class «lowquality» в тело HTML. КСТАТИ. Вы можете легко отследить WebView, установив user-agent в настройках WebView. Затем я создал новое правило CSS
body.lowquality * { filter: none !important; }
Попробуй это:
mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
Если вы привязываетесь к событию onclick
, это может быть медленным на сенсорных экранах.
Чтобы сделать это быстрее, я использую fastclick , который использует гораздо более быстрые события касания, чтобы имитировать событие click.