Android веб-браузер медленный - PullRequest
       16

Android веб-браузер медленный

163 голосов
/ 15 сентября 2011

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

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

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

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

Ответы [ 10 ]

126 голосов
/ 23 сентября 2011

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

Установить более высокий приоритет рендеринга (устарело из 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);
49 голосов
/ 17 апреля 2012

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

Больше информации здесь: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

35 голосов
/ 05 апреля 2013

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

12 голосов
/ 19 сентября 2014

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

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

9 голосов
/ 05 ноября 2012

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

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

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

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

Все события касания идут так: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Поэтому нам нужно сохранять движения ВНИЗ и ВВЕРХ и фильтровать скорость ПЕРЕМЕЩЕНИЯ (это плохие парни).

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

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

8 голосов
/ 28 июня 2014

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

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

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

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

Подробная проблема, с которой я столкнулся: https://stackoverflow.com/a/24467920/3595386

4 голосов
/ 22 октября 2016

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

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

Решение

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

body.lowquality * { filter: none !important; }
4 голосов
/ 10 апреля 2014

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

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

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

3 голосов
/ 27 февраля 2014

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

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
2 голосов
/ 27 июня 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...