Android webview slow

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

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

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

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

Ответ 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);

Ответ 3

Решение для нас было противоположным. Мы отключили аппаратное ускорение только в 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

Ответ 4

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

Если у вас была возможность изучить события перетаскивания, немного, создав класс "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. Однако это лучшее решение, которое я нашел, по крайней мере, для моих конкретных потребностей.

Ответ 5

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

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. Я думаю, что он работает лучше с аппаратным ускорением.

Ответ 6

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

Наконец, после целого дня поиска я сделал это. Я установил внутри тега (а не тег) моего AndroidManifest
<application android:hardwareAccelerated="false" ...

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

Детальная проблема: fooobar.com/questions/44967/...

Ответ 7

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

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

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

Ответ 8

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

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

Решение

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

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

Ответ 9

Попробуйте следующее:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

Ответ 10

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

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