WebView kann nicht rendern bis berührt Android 4.2.2

Ich entwickle einen Open-Source-Browser namens Lightning Browser, und ich habe in Schwierigkeiten mit dem neuesten Update auf Android (4.2.2) gelaufen.

WebViews werden nicht vollständig ausgeführt, bis die Ansicht berührt wird. Es kommt nur auf die neueste Android-Version. Auf 4.2.1 hat das WebView ganz gut gemacht. Ich benutze meine Nexus 7 für die Entwicklung und direkt nachdem ich das 4.2.2 Update erhalten habe, stoppte der Browser das Rendering. Andere Benutzer erlebten dies auch, und es wurde mehrfach bestätigt, um NUR auf 4.2.2 zu passieren. Es passiert auf API Level 16 und 17, aber ich habe einen WebKit Browser gesehen, der API Level 9 ohne dieses Problem zielt.

Ich habe versucht, dies mit der Lösung auf ein Problem zu beheben, das ich hier auf Stack Overflow gefunden habe ( Android WebView macht leer / weiß, die Ansicht nicht auf CSS-Änderungen oder HTML-Änderungen aktualisiert, Animationen sind abgehackt ). Jedenfalls, das Setzen der WebView RenderPriority auf hoch alleine löst es nicht … der einzige Weg, um es zu rendern, ohne berührt zu werden, war, den Befehl ungültig () innerhalb der OnDraw () – Methode von WebView zu platzieren. Dadurch wird das WebView kontinuierlich neu gestartet. Dies funktioniert (Art von), Animationen sind glatt, die Seite lädt sehr schnell, aber es bewirkt, dass die Leistung von WebView ansonsten abfällt.

Ich habe auch diese Frage gesehen (sehr ähnlich zu mir), aber es gibt keine gute Antwort dafür. Android WebView schlägt fehl, den Inhalt bis zur Benutzerinteraktion vollständig zu verteilen

Durch Performance-Drop, ich meine Eingabe. Text-Eingabe verzögert, und die WebView selbst kann nicht verarbeiten, was los ist wie schon vor. Benchmarking des Browsers mit dem ungültigen () Methodenaufruf fällt die Benchmarking-Performance um rund 8%. Ich weiß, dass Benchmarks nicht alles sind, aber es sagt mir, dass die kontinuierliche Zeichnung das System belastet und das System dazu veranlasst, andere Aufgaben zu ignorieren.

In Fazit … Das WebView in Android 4.2.2 wird nicht bis zum Berühren rendern. Der einzige Weg, den ich kenne, um dies zu beheben, ist, ungültig () in der onDraw () – Methode von WebView aufzurufen. Das ist schlecht für die Leistung und ich bin auf der Suche nach einem anderen Weg, um dies zu beheben.

Der Magic Code (ich bin derzeit) …

class MyWebView extends WebView { @Override onDraw(Canvas canvas) { invalidate(); super.OnDraw(canvas); } } 

entfernen

 invalidate(); 

Und es wird nicht gemacht, bis berührt.

Hat jemand einen Vorschlag, wie man das WebView rendern lässt (anders als was ich gemacht habe)? Übrigens, das ist meine erste Frage, die ich hier auf Stack gefragt habe, also verzeih mir, wenn ich nicht klar wäre oder ob ich etwas falsch gemacht habe

EDIT: Ich habe diese Frage hier über ein ähnliches Problem gefunden und es wurde gelöst, das Problem ist, ich verstehe nicht, was die Antwort auch bedeutet. Wenn jemand mich aufklären könnte, könnte es helfen.

Ich bekomme diesen Fehler in Logcat

 E/chromium(1243): external/chromium/net/disk_cache/backend_impl.cc:2022: [0705/172030:ERROR:backend_impl.cc(2022)] Corrupt Index file 

  • Wie benutzt man WebMessagePort als Alternative zu addJavascriptInterface ()?
  • Caching im Android-Webview
  • Android: Problem mit Debugging Javascript in Webview
  • Um eine statische HTML-Seite in Android zu zeigen
  • Festlegen von WebView zum Anzeigen von Desktop-Site und Nicht-Mobile-Site
  • Ist addJavascriptInterface () auf getClass () angewiesen?
  • Ist "shouldOverrideUrlLoading" wirklich veraltet? Was kann ich stattdessen verwenden?
  • Android Webview - Webseite sollte auf den Gerätebildschirm passen
  • 4 Solutions collect form web for “WebView kann nicht rendern bis berührt Android 4.2.2”

    Also habe ich endlich das Problem gefunden, dass die WebView nicht zu rendern. Ich beginne und stoppe die Animation eines Zeichensatzes im WebViewClient meiner WebView. Diese Zeichenkette ist einfach eine Auffrischungstaste, die sich dreht, wenn die Seite geladen wird … einfach richtig?

    Nun, im Nicht-Vollbildmodus des Browsers sind das rotierende Ziehbares und das WebView beide Kinder des gleichen Elternteils, während im Vollbildmodus das Ziehbare ein Kind der WebView wird. Irgendwie, durch das Starten der Animation, wenn die Seite geladen wird und stoppt es, wenn es fertig ist (in Vollbild), die Anwendung entscheidet, dass die rotierende ziehbar ist, was braucht alle Zeichnung Macht und die WebView nie zieht. Wenn im Vollbildmodus und der Zeichenkeit ein Kind des WebView wird, hat das WebView dann eine höhere Rendering-Priorität als das Ziehbare und es zieht gut.

    Die Moral der Geschichte ist … WebViews gerne die höchste Priorität zu ziehen. Wenn es andere Ansichten gibt, die größere Priorität bekommen, werden sie nicht richtig zeichnen.

    Ich bin kein Experte für Animationen, also muss ich darüber nachdenken, wie ich das Ziehbare jetzt animiere, um das WebView nicht zu unterbrechen.

    Hoffentlich war das sinnvoll. Danke fürs Lesen.

    Deaktivieren Sie die Hardwarebeschleunigung auf Ihrem Manifest:

    Android: hardwareAccelerated = "false"

    Bitte sehen Sie die letzte Antwort von @Olivier auf Android WebView macht leer / weiß, die Ansicht nicht auf CSS-Änderungen oder HTML-Änderungen zu aktualisieren, Animationen sind abgehackt , er löst ein paar verzögerte Invalidaten auf WebView OnTouchEvent anstatt kontinuierlich auf onDraw … In Mein Fall es funktionierte, weil (die meisten) meiner Probleme waren nach einem Benutzer berühren Webview und ich ändern einige CSS als Antwort. Natürlich gilt das überhaupt nicht für den Fall der automatischen / timeout's css

    In meinem Fall hat es auch geholfen, eine JavaScript-Funktion aus Java zu exportieren, um manuell ungültig zu machen, mit einer Verzögerung, also wenn in JavaScript Sie mehr oder weniger wissen, wo die Katastrophe passieren könnte man manuell auslösen, so etwas wie diese innere Klasse in Ihrem WebView:

     public class MyWebView extends WebView { private class InvalidateExtension { private Handler handler=new Handler(); // you might already have a handler private Runnable mInvalidater=new Runnable() { @Override public void run() { MyWebView.this.invalidate(); } } public void trigger(int delay) { handler.postDelayed(mInvalidater, delay); handler.postDelayed(mInvalidater, 2*delay); // just in case handler.postDelayed(mInvalidater, 4*delay); // just in case just in case :) } } /** Call this function on this view's init, BEFORE loading a page so it is available to JS */ private void call_me_on_init_to_enable_hack() { addJavascriptInterface(new InvalidateExtension(), "Invalidater"); } } 

    Also, aus JavaScript können Sie:

     Invalidater.trigger(100); 

    Und spiel mit dem Millisekunden Wert ….

    Hoffe das hilft jemandem!

    Es gibt ein Problem mit der Zoom-Skala beim Drehen des Telefons und das wird dieses Problem verursachen, werden Teile oder die ganze Seite nicht gezeichnet. Um dieses Override aufScaleChanged in Ihrer WebViewClient-Implementierung zu lösen und die Ansicht ungültig zu machen. Das sollte bei Bedarf eine Nachbildung erzwingen.

     @Override public void onScaleChanged(WebView view, float oldScale, float newScale) { if (view != null) { view.invalidate(); } } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.