Hallo Habr! In diesem Artikel, der sich an Anfänger richtet, möchte ich einige Tipps zur Optimierung der Nutzung des Gerätespeichers durch die Anwendung geben, um OutOfMemory nicht ständig abzurufen, und auch die Verwendung von Vektorgrafiken in der aktuellen Version von Android Studio (3.4) in Betracht ziehen, da die meisten russischsprachigen Ressourcen diesbezüglich Das Thema (der letzte
Artikel über Habré über Vektorbilder stammt aus dem Jahr 2015) ist veraltet, was unerfahrene Entwickler häufig in die Irre führt. Also fangen wir an.
1. Verwenden Sie Vektorbilder anstelle von Bitmaps
Natürlich sollten große Bilder mit vielen kleinen Details nicht in einen Vektor konvertiert werden - dies nimmt genauso viel Platz ein wie ein Raster, wenn nicht sogar mehr. Kleine Bilder wie Symbole und andere Details der Benutzeroberfläche sollten jedoch in einen Vektor konvertiert werden, um Speicherplatz zu sparen. Und das Arbeiten mit
Vektorbildern ist oft viel bequemer. Und jetzt das Wichtigste - wie geht das?
- Öffnen Sie Android Studio.
- Klicken Sie mit der rechten Maustaste auf den Zeichenordner oder dessen Inhalt> Neu> Vektor-Asset

- Geben Sie den Pfad zu Ihrer SVG-Datei an. Wenn Ihr Bild eine unregelmäßige Form hat, empfehlen wir Ihnen, das Kontrollkästchen neben dem Parameter Überschreiben zu aktivieren. Andernfalls wird das Bild auf Standardgrößen angepasst, wodurch die Proportionen verzerrt werden können.

- Weiter> Fertig stellen
- Fertig!
Für die Konvertierung von Raster zu Vektor kann ich eine hervorragende kostenlose
Inkscape- Anwendung empfehlen. Ein wenig über die Arbeit mit ihm:
- Öffnen Sie Inkscape.
- Ziehen Sie ein beliebiges Raster hinein. Wählen Sie im folgenden Fenster die Importoptionen aus und klicken Sie auf OK.
- Wählen Sie in der oberen Symbolleiste nach Auswahl unseres Bildes Pfad> Raster vektorisieren (Umschalt + Alt + B).
- Nun das Wichtigste. Aktivieren Sie im neuen Fenster das Kontrollkästchen neben "Hintergrund entfernen" und wählen Sie Folgendes aus: ob unser Bild farbig ist und wie viele Scans durchgeführt werden sollen. Wir dürfen nicht vergessen, dass die Größe unserer Vektordatei direkt von diesen beiden Parametern abhängt.
Mehr Scans - mehr Farben, Schattierungen und Details. Mein Kobold, um ein göttliches Aussehen zu erhalten, waren aufgrund der größeren Anzahl von Farben im Bild 30 Scans erforderlich. Das ist ziemlich viel, es ist besser, nicht mehr als zehn zu machen und Bilder einfacher auszuwählen.

- Schließen Sie das Fenster, klicken Sie auf das Raster und löschen Sie es mit der Entf-Taste. Gehen Sie zu Datei> Dokumenteigenschaften (Umschalt + Strg + D) und passen Sie die Seitengröße für den Inhalt an.
Jetzt werden wir einen kleinen Test durchführen, der den Vorteil des Vektors beim Speichern von Speicher belegt.
Ich habe ein neues Projekt mit einer einzelnen ImageView erstellt, auf das ich eine Animation angewendet habe, die es von Punkt A nach Punkt B verschiebt und die Bilder abwechselnd in Raster und Vektor ändert. Wir schauen uns die Daten an.
Raster

Vektor

Der Unterschied ist fast zweimal. Ich finde das ziemlich überzeugend.
2. Erhöhen Sie die Heap-Größe
Wechseln Sie dazu zum Manifest Ihres Projekts (App> Manifeste> AndroidManifest.xml) und fügen Sie die Zeile in die Anwendungsspalte ein:
android:largeHeap="true"
Tatsächlich ist das Erhöhen des Heaps keine Lösung für das OutOfMemory-Problem, sondern das Verschieben in den hinteren Bereich. Anstatt die Nutzung des Gerätespeichers durch die Anwendung zu optimieren, geben wir ihm mehr Speicherplatz. Vergessen Sie nicht, dass jedes Gerät über eine eigene primäre und sekundäre Speicherkapazität für die Anwendung verfügt.
3. Vermeiden Sie Speicherlecks
Jede Anwendung in ihrer Arbeit verwendet viele Objekte, die natürlich einen bestimmten Platz im Gedächtnis einnehmen. Im Idealfall sollte der Garbage Collector nicht verwendete Objekte daraus entfernen. Manchmal gibt es jedoch sogenannte „Speicherlecks“, die schwerwiegende Probleme in der Anwendung verursachen. Es gibt verschiedene Ursachen für Speicherlecks, die
hier ausführlich beschrieben
werden .
Ich selbst möchte die von Badoo entwickelte
WeakHandler- Bibliothek
empfehlen , die Speicherlecks im Zusammenhang mit dem Missbrauch von android.os.Handler beseitigen soll. Um diese Bibliothek zu verwenden, fügen Sie der Spalte "Abhängigkeiten" in Ihrer Gradle-Datei die folgende Zeile hinzu (Gradle-Skripte> build.gradle (Modul: App)):
compile 'com.badoo.mobile:android-weak-handler:1.1'
und in der Java-Datei:
private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); }
Und vergessen Sie nicht, WeakHandler selbst zu importieren, wenn das Studio dies nicht automatisch getan hat.
4. Vermeiden Sie große Zeitrafferanimationen
Frame-für-Frame-Animationen in Android Studio sind praktisch, aber nicht die wirtschaftlichste. Wenn Sie eine große Anzahl von Bildern verwenden, erhalten Sie mit Sicherheit OutOfMemory.
Wenn Sie es jedoch wirklich benötigen, ist es besser, das GIF-Bild zusammen mit der
Android Gif Drawable- Bibliothek zu verwenden. Diese Bibliothek vereinfacht die Arbeit mit Gifs und verbraucht viel weniger Speicher als Einzelbildanimationen von Android Studio. Um diese Bibliothek zu verwenden, fügen Sie der Spalte "Abhängigkeiten" in Ihrer Gradle-Datei die folgende Zeile hinzu (Gradle-Skripte> build.gradle (Modul: App)):
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16'
und in Ihrer zweiten Gradle-Datei (Gradle-Skripte> build.gradle (Modul: „Ihr Anwendungsname“)) in den Buildscript- und allproject-Spalten die Zeile:
mavenCentral()
und in der Java-Datei:
GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start();
Um gif zu deaktivieren, schreiben Sie anstelle von start () stop (). Vergessen Sie auch nicht, Gifs zu komprimieren, dies spart noch mehr Platz.
Ich hoffe, dass mein Artikel für Sie nützlich war. Vielen Dank.