Webview Android lent

mon android webviews sont lents. C'est sur tout, des téléphones à 3.0+ tablettes avec des spécifications plus qu'adéquates

je sais que les webviews sont censés être "limité", mais je vois applications web fait avec le téléphone gap qui doit être en utilisant toutes sortes de CSS3 et JQuery sorcellerie, ils fonctionnent juste fine et rapide

donc je rate quelque chose, est-ce qu'il y a une sorte de myWebview.SPEEDHACK(1) que je peux utiliser pour accélérer les choses?

aussi, parfois le contenu de mon webview ne se charge tout simplement pas, au lieu de se charger lentement, il ne se charge pas. Le bien que je teste est stocké localement, pas d'erreurs.

148
demandé sur Xcodian Solangi 2011-09-15 00:16:01

10 réponses

cela dépend de l'application web chargée. Essayez quelques-unes des approches ci-dessous:

priorité de rendu supérieure (dépréciée à partir de L'API 18+):

webview.getSettings().setRenderPriority(RenderPriority.HIGH);

activer/désactiver l'accélération matérielle:

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);
}

désactivez le cache (si vous avez des problèmes avec votre contenu):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
115
répondu peceps 2017-04-11 08:04:41

ajouter ce android:hardwareAccelerated="true" dans le manifeste était la seule chose qui a considérablement amélioré la performance pour moi

plus d'informations ici: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

45
répondu Sender 2012-04-17 14:39:58

la solution pour nous était le contraire. Nous avons désactivé l'accélération matérielle sur le WebView seulement (plutôt que sur l'application entière dans le manifeste) en utilisant ce code:

if (Build.VERSION.SDK_INT >= 11){
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

CSS3 les animations sont plus fluides maintenant. Nous utilisons Android 4.0.

plus d'informations ici: https://code.google.com/p/android/issues/detail?id=17352

31
répondu Ena 2013-04-05 10:37:57

j'avais ce même problème et j'ai dû le résoudre. J'ai essayé ces solutions, mais à la fin de la performance, au moins pour le défilement ne s'est pas amélioré. Voici donc le workaroud que j'ai fait et l'explication de pourquoi il a fonctionné pour moi.

si vous avez eu la chance d'explorer les événements de traînée, juste un peu, en créant une classe "MiWebView", en écrasant la méthode "onTouchEvent" et au moins imprimé l'heure à laquelle chaque événement de traînée se produit, vous veillez à ce qu'ils soient séparés dans le temps pour (jusqu'à) 9m de distance. C'est très peu de temps entre les deux événements.

regardez le code source de WebView , et voyez juste la fonction onTouchEvent. C'est juste impossible qu'il soit géré par le processeur en moins de 9ms (continuer à rêver!!!). C'est pourquoi vous voir constamment de la "Miss glisser comme nous sommes en attente de WebCore réponse pour toucher le sol." message. Le code ne peut pas être manipulé à temps.

comment le corriger? Tout d'abord, vous ne pouvez pas réécrire le code onTouchEvent pour l'améliorer, c'est juste trop. Mais, vous pouvez "s'en moquer" afin de limiter le taux d'événements pour glisser mouvements disons à 40 ms ou 50ms. (cela dépend du processeur).

Tous les événements tactiles comme ça: ACTION_DOWN -> ACTION_MOVE......ACTION_MOVE - > ACTION_UP. Nous devons donc garder les mouvements vers le bas et vers le haut et filtrer le taux de déplacement (ce sont les méchants).

et voici un moyen de le faire (vous pouvez ajouter plus de types d'événements comme 2 fingers touch, Tout ce que je suis intéressé ici est le défilement d'un seul doigt).

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;
    }
}

bien sûr, utilisez cette classe à la place de WebView et vous verrez la différence lors du défilement.

il s'agit simplement d'une approche à une solution, mais qui n'est pas encore entièrement implémentée pour tous les cas de retard dû au fait que L'écran est touché lors de L'utilisation de WebView. Cependant, il est la meilleure solution que j'ai trouvé, au moins pour mon besoins spécifiques.

8
répondu Nate Castro 2012-11-05 17:07:32

je pense que les œuvres suivantes:

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 a un moteur chromé pour WebView. Je suppose que ça marche mieux avec l'accélération matérielle.

8
répondu Tedi 2016-12-18 03:17:28

j'ai essayé toutes les propositions pour corriger le problème de rendu de performance dans mon application phonegap. Mais rien de vraiment travaillé.

finalement, après une journée entière de recherches, je l'ai fait. J'ai placé dans la balise (pas la balise) de mon AndroidManifest

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

Maintenant, l'application se comporte de la même manière rapide que mon webbrowser. Semble que, si l'accélération matérielle n'est pas toujours la meilleure option...

le problème détaillé que j'ai eu: https://stackoverflow.com/a/24467920/3595386

7
répondu user3595386 2017-05-23 10:31:17

S'il n'y a que quelques composants de votre webview qui sont lents ou lents, essayez d'ajouter ceci aux éléments css:

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

C'est le seul speedhack qui a vraiment eu un effet sur mon webview. Mais attention à ne pas en abuser! (vous pouvez en savoir plus sur le piratage dans cet article .)

3
répondu Erex 2014-04-09 20:39:03

aucune de ces réponses ne m'a été utile.

enfin j'ai trouvé raison et solution. La raison en était beaucoup de filtres CSS3 (filter, -webkit-filter).

Solution

j'ai ajouté la détection de WebView dans le script de page web afin d'ajouter la classe" lowquality " au corps HTML. BTW. Vous pouvez facilement suivre WebView en définissant user-agent dans les paramètres de WebView. Puis j'ai créé une nouvelle règle CSS

body.lowquality * { filter: none !important; }
3
répondu l00k 2016-10-21 21:51:41

essayez ceci:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
2
répondu George Maisuradze 2014-02-27 13:26:17

si vous êtes lié à l'événement onclick , il peut être lent sur les écrans tactiles.

Pour le rendre plus rapide, j'utilise fastclick , qui utilise l'accélération des événements tactiles pour imiter l'événement click.

2
répondu Tzach 2014-06-27 13:22:36