Android webview slow

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

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

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

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

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

Установите более высокий приоритет рендеринга (устаревший от 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.

  • Насколько быстрее C ++, чем C #?
  • Можно ли заставить существующее приложение Java использовать не более x ядер?
  • «SELECT COUNT (*)» медленный, даже с предложением where
  • Отладка и производительность релиза
  • Самый быстрый способ удалить все непечатаемые символы из строки Java
  • Являются ли статические вызовы Java более или менее дорогостоящими, чем нестатические вызовы?
  • Быстрая реализация алгоритма для сортировки очень малого списка
  • Какова цель регистра указателя кадров EBP?
  • Почему создание Thread считается дорогостоящим?
  • MySQL загружает данные infile - ускорение?
  • Minify Html выход приложения ASP.NET
  • Interesting Posts

    Подключение к удаленному рабочему столу игнорирует сохраненные учетные данные

    mysql DECLARE WHILE вне хранимой процедуры как?

    Значение сообщений хореографа в Logcat

    Добавление существующего XML-файла с помощью XmlWriter

    Каков наилучший способ отслеживания и записи URL-адресов, вызываемых устройством, для установки или просмотра истории просмотров?

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

    функция cat вызывает read () бесконечное время

    Firefox, сохраняя все изображения с каждой страницы, чтобы их можно было восстановить?

    Как сделать загрузку Windows 7 более простой, чем пустой экран с помощью мыши?

    Как я могу узнать, является ли моя Windows 32-битной или 64-битной?

    SSH Advanced Logging

    В чем разница между группами по умолчанию в Mac OS X?

    Сопоставлено ли целочисленное переполнение по-прежнему неопределенным поведением в C ++?

    Лучший способ обнаружить выпускную сборку из сборки отладки? .сеть

    Перемещение UIView (изображение и текст)

    Давайте будем гением компьютера.