Android webview langsam

Meine Android-Webseiten sind langsam. Dies ist alles von Handys zu 3.0 + Tabletten mit mehr als adäquaten Spezifikationen

Ich weiß, dass Webviews sollen "begrenzt" sein, aber ich sehe Web-Apps mit Telefon-Lücke, die mit allen Arten von CSS3 und JQuery Zauberei, sie laufen ganz gut und schnell

  • Vermeiden fussel, wenn gradle ausführen check
  • Methodenaufruf kann java NullpointerException erzeugen
  • Aspectj mit der androidbibliothek
  • Offline-Karten SDK für Android und iOS
  • Erkennung der Tastatur-IME-Sprache auf Android
  • Spezielle Zeichen werden durch ein Quadrat in Android App ersetzt
  • myWebview.SPEEDHACK(1) fehlt mir etwas, gibt es irgendeine Art von myWebview.SPEEDHACK(1) , die ich verwenden kann, um die Dinge zu beschleunigen? Vielen Dank

    Auch manchmal der Inhalt meiner Webansicht einfach nur nicht laden, anstatt langsam zu laden, wird es einfach nicht geladen. Das Asset, das ich teste, ist lokal gespeichert, keine Fehler.

  • Eine Menge von NPE von DeviceMotionService passiert vor kurzem
  • VideoView getDrawingCache kehrt schwarz zurück
  • PhoneGap / Cordova Android Entwicklung
  • OnTouch geben komische Touch-Punkte Android
  • ActionBarCompat: java.lang.IllegalStateException: Sie müssen ein Theme.AppCompat verwenden
  • So verwenden Sie Javascript zu erkennen, wenn Phonegap-basierte Android App verliert Fokus
  • 10 Solutions collect form web for “Android webview langsam”

    Es hängt davon ab, dass die Webanwendung geladen wird. Versuchen Sie einige der folgenden Schritte:

    Setzen Sie höhere Renderpriorität (veraltet von API 18+):

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

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

    Deaktivieren Sie den Cache (wenn Sie Probleme mit Ihrem Inhalt haben):

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

    Hinzufügen dieser android:hardwareAccelerated="true" im Manifest war das einzige, was die Leistung für mich deutlich verbessert hat

    Mehr Infos hier: http://developer.android.com/guide/topics/manifest/application-element.html#hwaccel

    Die Lösung für uns war das Gegenteil. Wir haben die Hardwarebeschleunigung nur auf der WebView (und nicht auf der gesamten App im Manifest) unter Verwendung dieses Codes deaktiviert:

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

    CSS3 Animationen sind jetzt glatter. Wir verwenden Android 4.0.

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

    Ich denke, die folgenden Werke 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 hat Chromium Engine für WebView. Ich denke, es funktioniert besser mit Hardwarebeschleunigung.

    Ich hatte das gleiche Problem und ich musste es ausarbeiten. Ich habe diese Lösungen ausprobiert, aber am Ende hat sich die Leistung zumindest für das Scrollen nicht verbessert. Also hier die Arbeit, die ich gemacht habe und die Erklärung dafür, warum es für mich gearbeitet hat.

    Wenn du die Chance hast, die Drag Events zu erforschen, nur ein wenig, indem du eine "MiWebView" -Klasse erschaffst, die "onTouchEvent" -Methode überschreibst und zumindest die Zeit gedruckt hast, in der jedes Drag Event auftritt, wirst du sehen, dass sie getrennt sind In der Zeit für (bis zu) 9ms entfernt. Das ist eine sehr kurze Zeit zwischen den Ereignissen.

    Schauen Sie sich den WebView Source Code an und sehen Sie einfach die onTouchEvent Funktion. Es ist einfach unmöglich für sie von der Prozessor in weniger als 9ms behandelt werden (Keep on dreaming !!!). Das ist der Grund, warum du ständig die "Fräulein einen Widerstand sehen wirst, während wir auf die Antwort von WebCore auf Berührung warten." Nachricht. Der Code kann einfach nicht rechtzeitig gehandhabt werden.

    Wie man es repariert? Zuerst kannst du den onTouchEvent-Code nicht neu schreiben, um es zu verbessern, es ist einfach zu viel. Aber du kannst es "verspotten", um die Ereignisrate für das Ziehen von Bewegungen zu begrenzen, sagen wir zu 40ms oder 50ms. (Dies hängt vom Prozessor ab).

    Alle Touch-Events gehen so: ACTION_DOWN -> ACTION_MOVE …… ACTION_MOVE -> ACTION_UP. Also müssen wir die DOWN- und UP-Bewegungen behalten und die MOVE-Rate filtern (das sind die Bösen).

    Und hier ist ein Weg, es zu tun (Sie können weitere Event-Typen wie 2 Finger berühren, alles, was ich interessiert bin hier ist die Single-Finger-Scrolling).

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

    Natürlich Verwenden Sie diese Klasse statt WebView und Sie sehen den Unterschied beim Scrollen.

    Dies ist nur ein Ansatz für eine Lösung, aber dennoch noch nicht vollständig implementiert für alle Lag-Fälle aufgrund von Bildschirm berühren bei der Verwendung von WebView. Allerdings ist es die beste Lösung, die ich gefunden habe, zumindest für meine spezifischen Bedürfnisse.

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

    Schließlich, nach einem ganzen Tag der Suche, habe ich es geschafft. Ich habe in den Tag (nicht das Tag) von meinem AndroidManifest gesetzt

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

    Jetzt verhält sich die App in der gleichen schnellen Weise wie mein Webbrowser. Scheint, wenn Hardwarebeschleunigung nicht immer das beste Merkmal ist …

    Das ausführliche Problem hatte ich: https://stackoverflow.com/a/24467920/3595386

    Wenn es nur einige wenige Komponenten Ihres Webview gibt, die langsam oder lockig sind, versuchen Sie, dies zu den Elementen hinzuzufügen: css:

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

    Das war der einzige Speedhack, der wirklich eine Wirkung auf meine Webansicht hatte. Aber seien Sie vorsichtig, es nicht zu übertreiben! (Sie können mehr über den Hack in diesem Artikel lesen.)

    Keiner dieser Antworten war für mich nicht hilfreich.

    Schließlich habe ich Grund und Lösung gefunden. Der Grund war eine Menge von CSS3-Filtern (Filter, -webkit-Filter).

    Lösung

    Ich habe die Erkennung von WebView in Web-Seite Skript hinzugefügt, um Klasse "lowquality" zu HTML-Körper hinzufügen. BTW Sie können WebView problemlos verfolgen, indem Sie User-Agent in WebView-Einstellungen festlegen. Dann habe ich neue CSS-Regel erstellt

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

    Versuche dies:

     mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 

    Wenn Sie an das onclick Ereignis onclick , könnte es auf den Touchscreens langsam sein.

    Um es schneller zu machen, benutze ich fastclick , der die viel schnelleren Touch-Events verwendet, um das Click-Event nachzuahmen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.