Android webview медленно



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



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



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



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

861   10  

10 ответов:

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

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

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

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

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

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

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

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

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

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 имеет хром двигатель для 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);

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

ни один из этих ответов не был полезным для меня.

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

решение

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

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

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

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);

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

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

Comments

    Ничего не найдено.