web-dev-qa-db-de.com

Android Webview langsam

Mein Android webviews Ist langsam. Dies gilt für alle Geräte, von Handys bis zu 3.0+ - Tablets mit mehr als ausreichenden technischen Daten

Ich weiß, dass Webviews "begrenzt" sein sollen, aber ich sehe Web-Apps, die mit Telefonlücken erstellt wurden, die alle Arten von CSS3 Und JQuery Zauberei verwenden müssen. Sie funktionieren einwandfrei und schnell

ich vermisse also etwas. Gibt es eine Art myWebview.SPEEDHACK(1), mit der ich Dinge beschleunigen kann?

außerdem wird der Inhalt meiner Webansicht manchmal einfach nicht geladen, statt langsam zu laden, wird er einfach nicht geladen. Das Asset, mit dem ich teste, wird lokal gespeichert, ohne Fehler.

164
CQM

Dies hängt von der geladenen Webanwendung ab. Probieren Sie einige der folgenden Ansätze aus:

Höhere Renderpriorität festlegen (veraltet von API 18+):

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

Hardware-Beschleunigung aktivieren/deaktivieren:

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

Deaktiviere den Cache (falls du Probleme mit deinem Inhalt hast):

webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
126
peceps

Hinzufügen dieses Android:hardwareAccelerated="true" im Manifest war das einzige, was die Leistung für mich signifikant verbesserte

Weitere Informationen finden Sie hier: http://developer.Android.com/guide/topics/manifest/application-element.html#hwaccel

50
Sender

Die Lösung für uns war das Gegenteil. Wir haben die Hardwarebeschleunigung nur im WebView (und nicht in der gesamten App im Manifest) mithilfe des folgenden Codes deaktiviert:

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

CSS3-Animationen sind jetzt flüssiger. Wir verwenden Android 4.0.

Weitere Informationen finden Sie hier: https://code.google.com/p/Android/issues/detail?id=17352

35
Ena

Ich denke, das funktioniert am besten:

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 verfügt über eine Chromium Engine für WebView. Ich denke, es funktioniert besser mit der Hardwarebeschleunigung.

13
Tedi

Ich hatte das gleiche Problem und musste es lösen. Ich habe diese Lösungen ausprobiert, aber am Ende hat sich die Leistung, zumindest für das Scrollen, überhaupt nicht verbessert. Also hier die Abhilfe, die ich durchgeführt habe und die Erklärung, warum es für mich funktioniert hat.

Wenn Sie die Möglichkeit hatten, die Ziehereignisse ein wenig zu untersuchen, indem Sie eine "MiWebView" -Klasse erstellen, die "onTouchEvent" -Methode überschreiben und mindestens die Zeit drucken, in der jedes Ziehereignis auftritt, werden Sie feststellen, dass sie getrennt sind rechtzeitig für (bis zu) 9ms entfernt. Das ist eine sehr kurze Zeit zwischen den Ereignissen.

Schauen Sie sich WebView Source Code an und sehen Sie sich nur die Funktion onTouchEvent an. Es ist einfach unmöglich, dass es vom Prozessor in weniger als 9 ms verarbeitet wird (Träumen Sie weiter !!!). Deshalb sehen Sie ständig die Meldung "Verpassen Sie einen Zug, während wir auf die Antwort von WebCore auf das Aufsetzen warten." Botschaft. Der Code kann einfach nicht rechtzeitig bearbeitet werden.

Wie man es repariert? Erstens kann man den onTouchEvent-Code nicht neu schreiben, um ihn zu verbessern, es ist einfach zu viel. Sie können es jedoch "verspotten", um die Ereignisrate für Ziehbewegungen auf beispielsweise 40 ms oder 50 ms zu begrenzen. (Dies hängt vom Prozessor ab).

Alle Berührungsereignisse sehen folgendermaßen aus: ACTION_DOWN -> ACTION_MOVE ...... ACTION_MOVE -> ACTION_UP. Wir müssen also die AB- und AUF-Bewegungen beibehalten und die MOVE-Rate filtern (das sind die bösen Jungs).

Und hier ist eine Möglichkeit, dies zu tun (Sie können weitere Ereignistypen wie 2-Finger-Touch hinzufügen, alles, was mich interessiert, ist das Scrollen mit einem Finger).

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

Verwenden Sie diese Klasse natürlich anstelle von WebView, und Sie werden den Unterschied beim Scrollen bemerken.

Dies ist nur ein Lösungsansatz, der jedoch aufgrund von Bildschirmberührungen bei Verwendung von WebView noch nicht in allen Verzögerungsfällen vollständig implementiert ist. Es ist jedoch die beste Lösung, die ich gefunden habe, zumindest für meine spezifischen Bedürfnisse.

9
Nate Castro

Ich habe alle Vorschläge ausprobiert, um das Render-Performance-Problem in meiner Phonegap-App zu beheben. Aber nichts hat wirklich funktioniert.

Endlich, nach einem ganzen Tag der Suche, habe ich es geschafft. Ich setze innerhalb des Tags (nicht des Tags) meines AndroidManifests

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

Jetzt verhält sich die App genauso schnell wie mein Webbrowser. Scheint so, als ob Hardwarebeschleunigung nicht immer das beste Feature ist ...

Das detaillierte Problem hatte ich: https://stackoverflow.com/a/24467920/3595386

8
user3595386

Keine dieser Antworten war für mich nicht hilfreich.

Endlich habe ich Grund und Lösung gefunden. Der Grund waren viele CSS3-Filter (Filter, -webkit-Filter).

Lösung

Ich habe die Erkennung von WebView im Webseiten-Skript hinzugefügt, um dem HTML-Text die Klasse "lowquality" hinzuzufügen. Übrigens. Sie können WebView einfach nachverfolgen, indem Sie den Benutzeragenten in den WebView-Einstellungen festlegen. Dann habe ich eine neue CSS-Regel erstellt

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

Wenn Ihre Webansicht nur einige wenige Komponenten enthält, die langsam oder verzögert sind, fügen Sie diese zu den Elementen css hinzu:

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

Dies war der einzige Speedhack, der sich wirklich auf meine Webansicht ausgewirkt hat. Aber seien Sie vorsichtig, um es nicht zu überbeanspruchen! (Sie können mehr über den Hack lesen in dieser Artikel .)

4
Erex

Versuche dies:

mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3

Wenn Sie an das Ereignis onclick binden, ist es auf Touchscreens möglicherweise langsam.

Um es schneller zu machen, benutze ich fastclick , das die viel schnelleren Berührungsereignisse verwendet, um das Klickereignis nachzuahmen.

2
Tzach