Heim > Artikel > Web-Frontend > 11 Interviewfragen zur Android-Leistungsoptimierung [mit Antworten]
Empfohlen: „Zusammenfassung der Android-Interviewfragen 2020 [Sammlung] “
Da die tatsächlichen Entwicklungs- und Referenzantworten unterschiedlich sein werden , und ich habe Angst, alle in die Irre zu führen, deshalb sollte ich die Antworten auf diese Interviewfragen besser selbst verstehen! Der Interviewer wird Fragen zu den im Lebenslauf genannten Wissenspunkten von oberflächlich bis tiefgehend stellen, also merken Sie sich die Antworten nicht und verstehen Sie mehr.
1. Im Cache der dritten Ebene werden Bilder in den Speicher geladen. Was passiert, wenn der Speicher bald platzt? Wie damit umgehen?
- Referenzantwort:
Zuerst müssen wir wissen, wie der Bildcache der dritten Ebene ist
Wenn der Speicher ausreicht, wird er nicht recycelt. Wenn der Speicher nicht ausreicht, wird das Soft-Referenzobjekt recycelt
2. Wenn ein 500*500 PNG High-Definition Bild wird in den Speicher geladen. Wie viel Speicher soll belegt werden?
- Referenzantwort:
- Wenn das Bildschirmverhältnis nicht berücksichtigt wird : Belegter Speicher = 500 * 500 * 4 = 1000000B ≈ 0,95 MB
- Unter Berücksichtigung des Bildschirmverhältnisses: Belegter Speicher = Breite Pixel x (inTargetDensity / inDensity) x Höhe Pixel x (inTargetDensity / inDensity) x eins Die von Pixeln belegte Speicherbytegröße
inDensity stellt die dpi des Zielbilds dar (in welchem Ressourcenordner). es wird platziert), inTargetDensity stellt die Zielbildschirm-DPI dar
3. Leistungsoptimierung von WebView?
4, also 4 MB. Wenn inSampleSize 2 ist, belegt das abgetastete Bild nur 5121024
- Referenzantwort:
1024. Dann belegt es 1024Zum Beispiel ein hochauflösendes Bild von 1024
- Am Prozess des Ladens einer Webseite sind native, Netzwerk-, Back-End-Verarbeitung und CPU beteiligt, und jeder hat die notwendige Arbeit und Abhängigkeiten, die es ihnen ermöglichen, jeden zu verarbeiten Andere parallel, anstatt sich gegenseitig zu blockieren, können dazu führen, dass die Webseite schneller geladen wird:
) unterstützen alle den Parameter BitmapFactory.Options. Sie können ein Bild einfach über den Parameter inSampleSize abtasten
- WebView wird langsam initialisiert. Sie können während der Initialisierung zuerst Daten anfordern, damit das Backend und das Netzwerk nicht im Leerlauf sind.
- Häufig verwendete JS-Lokalisierung und verzögertes Laden unter Verwendung eines Browserkernels eines Drittanbieters
- Die Endverarbeitung ist langsam, der Server kann für die Ausgabe in Trunks unterteilt werden und das Front-End lädt auch statische Netzwerkressourcen, während das Back-End Berechnungen durchführt.
- Wenn das Skript langsam ausgeführt wird, lassen Sie das Skript am Ende laufen, ohne die Seitenanalyse zu blockieren.
- Gleichzeitig kann ein angemessenes Vorladen und Vorcachen den Engpass bei der Ladegeschwindigkeit verringern.
- WebView lässt sich nur langsam initialisieren. Initialisieren Sie daher jederzeit ein WebView zur Verwendung.
- DNS und Links sind langsam. Finden Sie eine Möglichkeit, den vom Client verwendeten Domänennamen und Link wiederzuverwenden. 4. Wie geht Bitmap mit großen Bildern um, z. B. einem 30-Megapixel-Bild, und wie kann OOM verhindert werden? Referenzantwort: Um OOM-Probleme zu vermeiden, müssen Sie das Laden großer Bilder verwalten, hauptsächlich durch Skalierung, um die Speichernutzung von Bildern zu reduzieren.
- Die vier von BitmapFactory bereitgestellten Methoden zum Laden von Bildern (
decodeFile, decodeResource, decodeStream, decodeByteArray
512
4, also 1 MB (Hinweis: Laut der neuesten offiziellen Dokumentation sollte der Wert von inSampleSize immer ein Exponent von 2 sein, also 1, 2, 4, 8 usw. Wenn die externe Eingabe kleiner als ein Exponent von 2 ist, wird das System dies tun Wählen Sie außerdem standardmäßig den Index aus, der 2 am nächsten kommt, z. B. 2*)
- umfassend betrachtet. Bilder können durch die Abtastrate effektiv geladen werden:
- Setzen Sie den inJustDecodeBounds-Parameter von BitmapFactory.Options auf true und laden Sie das Bild
- Erhalten Sie die ursprünglichen Breiten- und Höheninformationen des Bildes von BitmapFactory.Options, die den Parametern outWidth und outHeight entsprechen
- Gemäß dem Regeln der Abtastrate und kombiniert mit den Anforderungen der Zielansicht Die Größe berechnet die Abtastrate inSampleSize
- Setzen Sie den inJustDecodeBounds-Parameter von BitmapFactory.Options auf false und Laden Sie das Bild neu
5. Speicherrecyclingmechanismus und GC-Algorithmus (die Vorteile verschiedener Algorithmen). Nachteile und Anwendungsszenarien); GC-Prinzip-Timing und GC-Objekte
6. Was ist der Unterschied zwischen Speicherverlust und Speicherüberlauf? Welche Tools stehen in AS zur Verfügung, um Speicherlecks zu erkennen?
- Referenzantwort:
- Es gibt zwei Mechanismen zur Bestimmung der Recyclingfähigkeit von Speicherobjekten:
- Referenzzählalgorithmus: Immer wenn ein Verweis darauf vorhanden ist, wird der Zählerwert um 1 erhöht; wenn der Verweis ungültig wird, wird der Zählerwert um 1 verringert Objekte mit einem Zähler von 0 zu jedem Zeitpunkt können einfach nicht mehr verwendet werden. Der Referenzzählalgorithmus wird jedoch nicht zur Speicherverwaltung in gängigen virtuellen Java-Maschinen verwendet. Der Hauptgrund dafür ist, dass es schwierig ist, das Problem der gegenseitigen Zirkelverweise zwischen Objekten zu lösen, sodass ein anderer Algorithmus zur Bestimmung des Objektüberlebens vorhanden ist entstanden.
- Erreichbarkeitsanalysemethode: Verwenden Sie eine Reihe von Objekten namens „GCRoots“ als Ausgangspunkt, suchen Sie von diesen Knoten nach unten und durchsuchen Sie den übergebenen Pfad heißt Referenzkette Wenn ein Objekt keine mit GC Roots verbundene Referenzkette hat, beweist dies, dass das Objekt nicht verfügbar ist. Unter diesen können die Objekte als GC-Roots verwendet werden: Objekte, auf die im Stapel der virtuellen Maschine verwiesen wird, beziehen sich hauptsächlich auf lokale Variablen im Stapelrahmen und NativObjekte, auf die durch Methoden verwiesen wird, Objekte, auf die durch statische Klassenattribute im Methodenbereich verwiesen wird, Objekte, auf die durch Konstanten verwiesen wird * im Methodenbereich
- Es gibt vier Arten von GC-Recycling-Algorithmen:
- Generationssammlungsalgorithmus : ist derzeit ein von kommerziellen virtuellen Maschinen verwendeter Algorithmus, der den Java-Heap basierend auf den verschiedenen Objektüberlebenszyklen in die neue Generation und die alte Generation unterteilt und basierend auf den Merkmalen jeder Generation den am besten geeigneten Sammlungsalgorithmus verwendet .
- Neue Generation: Viele Objekte sterben und nur wenige überleben. Mit dem „Kopieralgorithmus“ muss nur eine kleine Anzahl überlebender Objekte kopiert werden.
- Kopieralgorithmus: Teilen Sie den verfügbaren Speicher entsprechend der Kapazität in zwei gleich große Blöcke auf und verwenden Sie jeweils nur einen davon. Wenn dieser Speicherblock aufgebraucht ist, „kopieren“ Sie die verbleibenden Objekte in einen anderen Block und bereinigen Sie dann diesen Speicherblock sofort. Einfache Implementierung und effizienter Betrieb. Wenn die Objektüberlebensrate hoch ist, werden mehr Kopiervorgänge ausgeführt und die Effizienz wird geringer
- Alte Generation : Die Überlebensrate des Objekts ist hoch. Durch die Verwendung des „Mark-Sweep-Algorithmus“ oder „Mark-Sweep-Algorithmus“ müssen lediglich weniger Recyclingobjekte markiert werden.
- Mark-Clear-Algorithmus : Zuerst alle Objekte „markieren“, die recycelt werden müssen, und dann alle markierten Objekte einheitlich „löschen“. Die Effizienz sowohl des Markierungs- als auch des Löschvorgangs ist nicht hoch. Nach dem Löschen wird eine große Anzahl diskontinuierlicher Speicherfragmente generiert, wenn während der Programmausführung nicht genügend Speicherplatz gefunden werden muss . Der zusammenhängende Speicher muss im Voraus eine weitere Garbage-Collection-Aktion auslösen.
- Markierungs- und Organisationsalgorithmus : „Markieren“ Sie zunächst alle Objekte, die recycelt werden müssen, und „organisieren“ Sie sie dann so, dass die überlebenden Objekte erhalten bleiben Alle werden an ein Ende verschoben. Verschieben und schließlich den Speicher außerhalb der Endgrenze direkt bereinigen. Der Markierungsdeflationsalgorithmus verschiebt alle lebenden Objekte an ein Ende und verarbeitet nicht lebende Objekte, sodass keine Speicherfragmentierung entsteht
Referenzantwort:
7. Wie kann sichergestellt werden, dass die Anwendung ohne Verzögerung startet?
- Speicherüberlauf (nicht genügend Speicher) : bezieht sich auf den Fall Das Programm beansprucht Speicherplatz, es ist nicht genügend Speicherplatz vorhanden, und es wird angezeigt, dass nicht genügend Speicher vorhanden ist. Wenn Sie beispielsweise eine Ganzzahl beantragen, aber eine Zahl speichern, die nur durch einen Long-Wert gespeichert werden kann, liegt ein Speicherüberlauf vor .
- Speicherverlust: Dies bedeutet, dass das Programm, nachdem es Speicher beantragt hat, den zugewiesenen Speicherplatz nicht freigeben kann. Der Schaden eines Speicherverlusts kann jedoch ignoriert werden Der Speicherverlust Die Folgen der Anhäufung von Speicherverlusten sind sehr schwerwiegend. Egal wie viel Speicher verfügbar ist, er wird früher oder später belegt sein. Speicherverlust führt schließlich dazu, dass nicht mehr genügend Speicher vorhanden ist!
- Um Speicherlecks zu finden, können Sie das
- AndroidProfiler-Tool verwenden, das mit Android Studio oder MAT
- Referenzantwort:
- Die Startgeschwindigkeit der Anwendung hängt davon ab, was Sie in der Anwendung tun, zum Beispiel integrieren Sie viel SDK und das SDK Der Init-Vorgang muss im Hauptthread implementiert werden, sodass ein Gefühl der Verzögerung entsteht. Falls nicht erforderlich, können Sie das Laden verzögern oder die Sub-Thread-Verarbeitung starten
- Darüber hinaus sind die beiden Hauptfaktoren, die sich auf die Schnittstellenverzögerung auswirken, Schnittstellenzeichnung und Datenverarbeitung.
- Layoutoptimierung (Verwendung von include, Merge-Tags, ConstraintLayout wird für komplexe Layouts usw. empfohlen)
- In onCreate werden keine zeitaufwändigen Vorgänge ausgeführt( ), um die Seite anzuzeigen. Die Ansicht wird in AsyncTask unterteilt und schrittweise angezeigt. Es ist besser, Handler zu verwenden. Auf diese Weise sieht der Benutzer eine hierarchische und schrittweise Anzeige der Ansichten. Er sieht nicht zuerst einen schwarzen Bildschirm und zeigt dann alle Ansichten auf einmal an. Es ist besser, eine Animation daraus zu machen, der Effekt wird natürlicher sein.
- Der Zweck der Verwendung von Multithreading besteht darin, die Zeit von onCreate() und onReume() so weit wie möglich zu verkürzen, damit Benutzer die Seite so schnell wie möglich sehen und bedienen können .
- Reduzieren Sie die Blockierungszeit des Hauptthreads.
- Verbessern Sie die Effizienz von Adapter und AdapterView.
- Der Grund für den Schwarz-Weiß-Bildschirm: Wenn wir eine Anwendung starten, prüft das System, ob Es existiert bereits. Wenn ein solcher Prozess nicht vorhanden ist, überprüft der Systemdienst zunächst die Absichtsinformationen in startActivity, erstellt dann den Prozess und startet schließlich Activy, was einen Kaltstart darstellt. Während dieser Zeit tritt das Problem eines weißen und schwarzen Bildschirms beim Start auf. Bevor das System die Seite zeichnet und das Layout lädt, initialisiert es zunächst das Fenster (Fenster). In diesem Schritt legt das System die Farbe des Themas entsprechend dem von uns festgelegten Thema fest. Die von uns festgelegten Einstellungen bestimmen die angezeigte Farbe . Ist es ein weißer oder ein schwarzer Bildschirm?
- windowIsTranslucent und windowNoTitle, beide Eigenschaften auf true setzen (es kommt zu offensichtlichen Verzögerungen, nicht empfohlen)
- Wenn die Startseite nur ein Bild ist, dann einstellen Wenn Sie ein neues Thema speziell für die Startseite erstellen möchten, legen Sie das Attribut „android:windowBackground“ des Themas auf das Hintergrundbild der Startseite fest.
- Verwenden Sie „layer-list“, um ein Bild zu erstellen launcher_layer xml, legen Sie es als fest Legen Sie den Hintergrund des speziellen Themas der Startseite fest und legen Sie ihn als Hintergrund für das Layout der Startseite fest.
8. Wird die starke Referenz recycelt, wenn sie auf Null gesetzt ist? ?
- Referenzantwort:
- Der vom Objekt belegte Speicher wird nicht sofort freigegeben. Wenn die Referenz des Objekts auf Null gesetzt ist, wird die Referenz auf das Objekt nur im aktuellen Thread-Stack-Frame getrennt, und der Garbage Collector ist ein Thread, der nur im Hintergrund ausgeführt wird, wenn der Benutzer-Thread zum Safe ausgeführt wird Punkt (sicherer Punkt)) oder der sichere Bereich scannt die Objektreferenzbeziehung. Wenn das Objekt nicht referenziert wird, wird das Objekt zu diesem Zeitpunkt nicht sofort freigegeben, da einige Objekte wiederherstellbar sind (die Referenz). wird in der finalize-Methode wiederhergestellt). Der Objektspeicher wird nur gelöscht, wenn festgestellt wird, dass der Verweis auf das Objekt nicht wiederhergestellt werden kann.
9. Der Unterschied zwischen ListView und RecyclerView
Referenzantwort:
- Referenzantwort:
10. Was ist der Adapter von ListView?
- Animationsunterschied:
- In RecyclerView gibt es viele integrierte Animations-APIs, wie z. B. notifyItemChanged(), notifyDataInserted(), notifyItemMoved() usw.; Um Animationseffekte anzupassen, können benutzerdefinierte Animationseffekte durch die Implementierung (RecyclerView.ItemAnimator-Klasse) und den anschließenden Aufruf von
- vervollständigt werden, ListView jedoch keine Animationseffekte implementieren, aber wir können den Animationseffekt des Elements im Adapter selbst implementieren
- Aktualisierungsunterschied:
Cache-Unterschied:
- Normalerweise wird die Aktualisierung von Daten in ListView durch die Verwendung der globalen Aktualisierung „notifyDataSetChanged()“ stark beansprucht. selbst kann keine lokale Aktualisierung implementieren, aber wenn Sie eine teilweise Aktualisierung in ListView implementieren möchten Wenn die Daten eines Elements aktualisiert werden, können wir eine onItemChanged()-Methode im Adapter implementieren, die Position des Elements in der Methode ermitteln (kann getFirstVisiblePosition() übergeben) und dann getView( aufrufen. ) Methode zum Aktualisieren der Artikeldaten; Teilweise Aktualisierung kann in RecyclerView implementiert werden, zum Beispiel: notifyItemChanged();
- RecyclerView verfügt über zwei Cache-Ebenen mehr als ListView, unterstützt mehrere separate ItemView-Caches, unterstützt die von Entwicklern angepasste Cache-Verarbeitungslogik und unterstützt alle RecyclerViews, die denselben RecyclerViewPool nutzen (Cache-Pool).
- Die Caching-Mechanismen von ListView und RecyclerView sind grundsätzlich gleich, aber die Cache-Nutzung ist unterschiedlich
- BaseAdapter: Abstrakte Klasse In der tatsächlichen Entwicklung werden wir diese Klasse erben und verwandte Methoden neu schreiben.
- ArrayAdapter: unterstützt generische Operationen. Der einfachste Adapter kann nur eine Textzeile anzeigen~
- SimpleAdapter: Ein Adapter, der zudem über eine gute Skalierbarkeit verfügt und eine Vielzahl von Effekten anpassen kann!
- SimpleCursorAdapter: Eine ListView zur Anzeige einfacher Texttypen. Sie wird im Allgemeinen in Datenbanken verwendet, ist jedoch etwas veraltet und wird nicht empfohlen!
11. Leistungsvergleich von LinearLayout, FrameLayout und RelativeLayout, warum?
- Referenzantwort:
- RelativeLayout ruft onMeasure zweimal auf. Wenn LinearLayout Gewicht hat, ruft es auch zweimal onMeasure für die Unteransicht auf
- Wenn sich die Höhe der Unteransicht von RelativeLayout von der von RelativeLayout unterscheidet, führt dies zu Effizienzproblemen. Wenn die Unteransicht komplex ist, ist dieses Problem schwerwiegender. Versuchen Sie nach Möglichkeit, Polsterung statt Rand zu verwenden.
- Verwenden Sie LinearLayout und FrameLayout anstelle von RelativeLayout, ohne die Tiefe der Hierarchie zu beeinträchtigen.
Das obige ist der detaillierte Inhalt von11 Interviewfragen zur Android-Leistungsoptimierung [mit Antworten]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!