Wie kann die Speichernutzung beim Aufruf mehrerer WebView in Android gesteuert werden?

8

Die Hauptaktivität meiner App ist Activity , die ein Webview zum Laden von Webseiten enthält.

Ich überschreibe die Methode shouldOverrideUrlLoading(WebView view, String url) , damit jede URL-Anfrage eine Intent aufruft und eine neue gleiche Aktivität geladen wird, die WebView enthält.

Dies ist eine bessere Erfahrung, wenn die BACK-Taste gedrückt wird. Sie beendet nur die aktuelle Aktivität und kehrt zu der vorherigen Aktivität zurück. Sie brauchen keine Zeit mehr, um die Seite neu darzustellen, im Vergleich zur Verwendung von goBack () in einem einzelnen Webview.

Aber jetzt ist das Problem, dass, nachdem ich viele URLs geöffnet habe, eine lange Warteschlange von Aktivitäten im Hintergrund erstellt habe, der Speicher groß wurde.

Wenn ich zurück zum Startprogramm gehe und die Fortschritte überprüfe, kann ich sehen, dass meine App mehr als 200 Millionen Daten zwischenspeichert. Das ist nicht akzeptabel ...

Und es ist interessant, dass ich sehen kann, dass meine App meinen Speicher aufgebraucht hat, aber in der Heap-Ansicht von DDMS in Eclipse kann ich sehen, dass die App nicht mehr als 10 Millionen Speicher zugewiesen hat. Also ich denke, die 200M ist webStorage im Cache von Webview ?

Gibt es eine Möglichkeit, den Speicher zu steuern?

Ich überlege mir, ob ich vielleicht nur fünf Schichten von Aktivitäten gleichzeitig aufbewahre und wenn ich fünf Mal zurückgehe, dann spring einfach zurück zur Startseite. Aber ich weiß immer noch nicht, wie ich neben den 5 Aktivitäten, die ich brauche, Erinnerungen freisetzen kann, die ich nie wieder benutzen werde?

Oder wenn es so ist, weil die WebView Webseite automatisch im Cache speichert, wie kann ich das manuell verwalten? Wie zum Beispiel ein Limit für die maximale Cachegröße oder Seitenzahl setzen?

    
Aloong 17.01.2012, 11:23
quelle

1 Antwort

1
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ tag123memory ___ Verwenden Sie dieses Tag für die Speicherverwaltung oder Probleme beim Programmieren. Bei Fragen zu Speicherhardwareproblemen oder Fehlern in allgemeiner Software rufen Sie https://superuser.com oder https://serverfault.com auf, wenn dies mit Hardware oder Software auf Unternehmensebene zu tun hat. ___ tag123androidactivity ___ Fragen zum Erstellen oder Verwalten von Aktivitäten in Android. In Android-Anwendungen ist eine Aktivität eine Komponente, die eine Benutzerschnittstelle bietet, die dem Benutzer erlaubt, etwas zu tun. Einfache Beispiele sind: Wählen Sie das Telefon, machen Sie ein Foto, senden Sie eine E-Mail oder sehen Sie sich eine Karte an. ___ answer13499545 ​​___

Generell stimme ich Kevins Kommentar zu. Ich denke, mehrere Activity -Objekte zu behalten, um das erneute Laden von WebView zu verhindern, ist für eine mobile Umgebung mit so begrenzten Ressourcen nicht intuitiv.

Abgesehen davon haben Sie viele verschiedene Frage- und Lösungsmöglichkeiten, also habe ich keine einzige Antwort im Sinn. Sehen Sie sich diese Links an, um zu sehen, ob etwas hilfreich ist:

ActivityManager - hat eine Menge Zeug, das Sie möglicherweise verwenden können, überprüfen es ist Unterklassen.

ActivityManager.RunningTaskInfo - Niemals benutzt, scheint aber einige nützliche Dinge zu haben , insbesondere mit der Feststellung, welche Activity ausgeführt werden.

ActivityManager.MemoryInfo - Kann Ihnen auch Informationen zum verfügbaren Systemspeicher geben als untere Schwelle des Speichers.

Application.onLowMemory() - Bestätigt, wenn Ihre App gestartet wurde ein Gedächtnisschwein. Du kannst diese Methode überschreiben und% code_des% zerstören, wenn dieser aufgerufen wird. Sie müssen wahrscheinlich Activity aufrufen, um sicherzustellen, dass das Betriebssystem die erforderlichen Schritte ausführt.

Eine mögliche Lösung, bei der die Anzahl der Aktivitäten kontrolliert wird:

Überschreiben Sie super.onLowMemory() und erstellen Sie eine Application , die 5 public static ArrayList<Activity> -Objekte enthält. Immer wenn Sie Activity für onCreate() ausführen, können Sie die Aktivität zum Activity hinzufügen und dann die Größe überprüfen. Wenn die Größe & gt; 5 dann senden Sie eine ArrayList an die intent an der Position 0, die dazu führt, dass sie die Absicht behandelt und Activity aufruft. Dann entfernen Sie das Objekt aus dem finish() .

Sollte nicht zu viel Arbeit sein, aber der Nachteil ist, dass Sie Dinge manuell verwalten müssen. Ich bin mir sicher, dass es eine klügere Lösung gibt.

    
___ qstntxt ___

Die Hauptaktivität meiner App ist ArrayList , die ein %code% zum Laden von Webseiten enthält.

Ich überschreibe die Methode %code% , damit jede URL-Anfrage eine %code% aufruft und eine neue gleiche Aktivität geladen wird, die %code% enthält.

Dies ist eine bessere Erfahrung, wenn die BACK-Taste gedrückt wird. Sie beendet nur die aktuelle Aktivität und kehrt zu der vorherigen Aktivität zurück. Sie brauchen keine Zeit mehr, um die Seite neu darzustellen, im Vergleich zur Verwendung von goBack () in einem einzelnen Webview.

Aber jetzt ist das Problem, dass, nachdem ich viele URLs geöffnet habe, eine lange Warteschlange von Aktivitäten im Hintergrund erstellt habe, der Speicher groß wurde.

Wenn ich zurück zum Startprogramm gehe und die Fortschritte überprüfe, kann ich sehen, dass meine App mehr als 200 Millionen Daten zwischenspeichert. Das ist nicht akzeptabel ...

Und es ist interessant, dass ich sehen kann, dass meine App meinen Speicher aufgebraucht hat, aber in der Heap-Ansicht von DDMS in Eclipse kann ich sehen, dass die App nicht mehr als 10 Millionen Speicher zugewiesen hat. Also ich denke, die 200M ist %code% im Cache von %code% ?

Gibt es eine Möglichkeit, den Speicher zu steuern?

Ich überlege mir, ob ich vielleicht nur fünf Schichten von Aktivitäten gleichzeitig aufbewahre und wenn ich fünf Mal zurückgehe, dann spring einfach zurück zur Startseite. Aber ich weiß immer noch nicht, wie ich neben den 5 Aktivitäten, die ich brauche, Erinnerungen freisetzen kann, die ich nie wieder benutzen werde?

Oder wenn es so ist, weil die %code% Webseite automatisch im Cache speichert, wie kann ich das manuell verwalten? Wie zum Beispiel ein Limit für die maximale Cachegröße oder Seitenzahl setzen?

    
___ tag123webview ___ Elemente in grafischen Benutzeroberflächen, die HTML-Inhalt hosten. Für Android sehen Sie sich bitte das android-webview-Tag an. Unter iOS finden Sie unter uiwebview oder wkwebview. ___ qstnhdr ___ Wie kann die Speichernutzung beim Aufruf mehrerer WebView in Android gesteuert werden? ___ tag123caching ___ Ein Cache ist ein Mechanismus, um Daten lokal zwischenzuspeichern (Caching), um die Zugriffszeit auf weit entfernte Daten zu reduzieren. Für CPU / Disk / Web-Browsing verwenden Sie bitte relevante Tags (cpu-cache, diskcache, ...) ___
Jon 21.11.2012, 18:15
quelle