2016-04-12 7 views
11

Gibt es eine Möglichkeit, die Geschwindigkeit des Ladens einer lokalen .html Datei in eine WebView Datei zu verbessern. Die Dateien .html sind im Ordner /assets gespeichert.Android: WebView Ladegeschwindigkeit von lokalen HTML Dateien verbessern

Wie man im Video sehen kann (Sorry, Link ist gebrochen!), TextView (rot beackground) wiedergegeben wird, bevor die transistion beginnt, während der Text in den WebView danach gezeigt. Wie kann ich erreichen, das WebView so schnell wie das TextView zu laden?

//current implementation 
webView.setInitialScale(1); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.getSettings().setLoadWithOverviewMode(true); 
webView.getSettings().setUseWideViewPort(true); 
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
webView.setScrollbarFadingEnabled(false); 

webView.loadUrl("file:///android_asset/disclaimer.html"); 

ZUSAMMENFASSUNG

Es ist nicht möglich. Ich habe alle Kommentare hier ausprobiert und es hat keinen Unterschied gemacht.

Der Grund, warum ich fragte, war, dass wir eine Anwendung für iOS und Android hatten, die hauptsächlich aus einfachen TextViews und Images besteht. So hatten wir die Idee, lokalehtml Dateien zu erstellen, die wir in beiden Anwendungen verwenden konnten. In iOS funktioniert das wie ein Zauber, aber in Android konnten wir die Ladezeit nicht loswerden, also hatte ich immer einen leeren Bildschirm und nach 100-200ms erscheint der Inhalt.

Ich denke, Androids WebView startet Rendering, wenn die Aktivität sichtbar ist. Das macht total Sinn in Online-Modus, weil Sie nicht mehrere HTML-Seiten laden möchten, die der Benutzer in einem neuen Tap im Hintergrund öffnet, bevor er sie tatsächlich fokussiert. In Offline-Modus (lokale HTML-Dateien in der Anwendung assets gespeichert) ist dieses Verhalten nicht erforderlich, aber Sie können es nicht ändern.

Jetzt sind wir wirklich jetzt warum phonegap & co saugt.

Nur für das Protokoll: Am Ende verwendete ich eine Aktivität mit einem leeren LinearLayout Container, wo Sie Inhalte programmatisch einfügen konnten. Jeder Stil (Überschrift 1, Überschrift 2, Inhalt ...) hatte ein eigenes Layout XML-Datei

public void insertHeadline(int id){ 

    String text = getString(id); 
    TextView headline = (TextView) inflater.inflate(R.layout.layout_text_headline, null, false); 
    headline.setText(text); 

    //add this TextView to the empty container 
    myLinearLayoutContainerView.addView(headline); 

} 

Antwort

3

Ein Webview kann nie erstellt werden rot so schnell wie eine Textansicht (es sei denn, Sie missbrauchen wirklich die Textansicht, wie das Laden von Tausenden von Textzeilen), egal wie viele Schalter Sie ein- und ausschalten und wie viele Optimierungen und Optimierungen Sie versuchen. Der Rendering-Mechanismus favorisiert eine Textansicht, da sie weniger Möglichkeiten bietet, Änderungen an der normalen Präsentation vorzunehmen, da eine Webansicht externe Ressourcen laden kann, weil CSS die Darstellung verändern kann, da JavaScript die Darstellung beeinflussen kann, da mehr Speicher und Initialisierungen benötigt werden all diese Funktionen, ...

Es ist der Grund, warum eine phonegap/cordova App niemals so schnell und interaktiv sein kann wie eine native App. Nun, es sei denn, die native App besteht nur aus Web-Views: P

Sie können immer noch versuchen, die Lade-/Renderzeit von webview zu verbessern, indem Sie die Konfiguration ändern, aber Sie sollten besser warten, bis Ihr Inhalt definiert ist. Alle diese Einstellungen ermöglichen Verbesserungen unter bestimmten Umständen. Beispielsweise kann das Ändern des Layertyps die Renderzeit für verschiedene Seiten verbessern oder verschlechtern. Wie Nirmal in seiner Antwort erwähnt, sind einige der bekannteren, die eine größere Wirkung haben, LayerType, cacheMode und renderPriority. Ich gehe davon aus, dass das, was Sie erreichen wollten, verhindern, dass Ihre Benutzer einen unvollständigen Bildschirm sehen. Sie könnten ein Webview rendern, bevor Sie Ihren Bildschirm mit onPageFinished anzeigen, aber es würde nicht schneller laden, der Benutzer würde länger warten müssen, bis der Bildschirm übergeht und Sie wahrscheinlich ein Spinnrad benötigen würden.

Nach meiner Erfahrung ist die Art und Weise, wie Sie Ihren Übergang implementiert haben, die bessere Benutzererfahrung und ich würde warten, bis Sie Ihren HTML-Inhalt definiert haben, bevor Sie die Ladezeiten optimieren.

Wenn Sie bereits die aktuelle Erfahrung schon irritierend hart finden, würde ich in Erwägung ziehen, alle HTML-Inhalte/Webviews heraus zu nehmen.

4

WebView wird immer längere Zeiten machen als eine native Textview. Ich denke, es ist die Art der Plattform, aber vielleicht können Sie versuchen, HTML-Inhalt in eine Zeichenfolge vor dem Laden Bildschirm zu lesen (für die Vermeidung von Webview von Dateisystem-Betrieb). Und dann String mit:

webview.loadDataWithBaseURL("", earlyReadedHtmlString, "text/html", "UTF-8", ""); 

In der Theorie muss dies schneller und fair für Webview sein. Ein anderer Weg wartet auf onPageFinished() und zeigt dann textview an. Es kann eine Problemumgehung sein.

5

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

Set höhere Priorität machen (veraltet von API 18+):

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

Aktivieren/Deaktivieren der Hardwarebeschleunigung:

if (Build.VERSION.SDK_INT >= 19) { 
// 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); 
} 

den Cache deaktivieren:

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

Auf Assets kann nur langsam zugegriffen werden, da sie in der APK-Datei enthalten sind, was im Wesentlichen eine verherrlichte Zip-Datei ist.

Ich würde eine Startroutine schreiben, die die Dateien von Vermögenswerten nimmt einfach und schreibt sie in den internen Speicher (oder externen Speicher, wenn sie groß sind und enthalten keine sensiblen Daten.

Sobald Sie sie aus den apk der extrahierten Assets, sie sind viel viel schneller zu erreichen.

+0

Können Sie bitte, wie Vermögenswerte anderswo kopieren? – soommy12