Maison  >  Article  >  interface Web  >  11 questions d'entretien sur l'optimisation des performances Android [avec réponses]

11 questions d'entretien sur l'optimisation des performances Android [avec réponses]

藏色散人
藏色散人avant
2020-07-31 14:04:324525parcourir

Recommandé : "Résumé des questions d'entretien Android 2020 [Collection] "

Parce que le développement réel et les réponses de référence seront différents Différent , et j'ai peur d'induire tout le monde en erreur, alors je ferais mieux de comprendre les réponses à ces questions d'entretien par moi-même ! L'intervieweur posera des questions sur les points de connaissances mentionnés dans le CV, de superficiel à approfondi, alors ne mémorisez pas les réponses et comprenez davantage.

1. Dans le cache d'images de troisième niveau, les images sont chargées en mémoire. Que se passera-t-il si la mémoire est sur le point d'éclater ? Comment y faire face ?

  • Réponse de référence :
    • Tout d'abord, nous devons savoir comment est le cache d'images de troisième niveau

      Si la mémoire est suffisante, elle ne sera pas recyclée. Lorsque la mémoire est insuffisante, l'objet de référence souple est recyclé

2. Si une haute définition 500*500 png l'image est chargée dans la mémoire. Quelle quantité de mémoire doit être occupée ?

  • Réponse de référence :
    • Si le rapport d'écran n'est pas pris en compte : Mémoire occupée = 500 * 500 * 4 = 1000000B ≈ 0,95 Mo
    • Considérant le rapport d'écran : Mémoire occupée = largeur pixels x (inTargetDensity / inDensity) x hauteur pixels x (inTargetDensity / inDensity) x one La taille d'octet de mémoire occupée par les pixels

inDensity représente le dpi de l'image cible (dans quel dossier de ressources il est placé), inTargetDensity représente le dpi de l'écran cible

Optimisation des performances de WebView ?

  • Réponse de référence :
    • Dans le processus de chargement d'une page Web, le natif, le réseau, le traitement back-end et le processeur participeront tous, et chacun a le travail et les dépendances nécessaires leur permettant de traiter chacun ; Les autres en parallèle au lieu de se bloquer peuvent accélérer le chargement de la page Web :
      • WebView s'initialise lentement Vous pouvez d'abord demander des données lors de l'initialisation afin que le backend et le réseau ne soient pas inactifs.
      • Localisation JS et chargement paresseux couramment utilisés, à l'aide d'un noyau de navigateur tiers
      • Le traitement final est lent, le serveur peut être divisé en lignes réseau pour la sortie et le front-end charge également les ressources statiques du réseau pendant que le back-end effectue le calcul.
      • Si le script s'exécute lentement, laissez-le s'exécuter à la fin sans bloquer l'analyse de la page.
      • Dans le même temps, un préchargement et une précache raisonnables peuvent réduire le goulot d'étranglement de la vitesse de chargement.
      • WebView est lent à s'initialiser, alors initialisez une WebView pour l'utiliser à tout moment.
      • Le DNS et les liens sont lents. Trouvez un moyen de réutiliser le nom de domaine et le lien utilisés par le client. 4. Comment Bitmap gère-t-il les images volumineuses, telles qu'une image de 30 Mo, et comment empêcher le MOO ?

        Réponse de référence : Pour éviter les problèmes de MOO, vous devez gérer le chargement des images volumineuses, principalement via une mise à l'échelle pour réduire l'utilisation de la mémoire des images.
      • Les quatre méthodes de chargement d'images fournies par BitmapFactory (
      • decodeFile, decodeResource, decodeStream, decodeByteArray
      ) prennent toutes en charge le paramètre BitmapFactory.Options. Vous pouvez facilement échantillonner une image via le paramètre inSampleSize.
    Par exemple, une image haute définition de 1024
  • 1024. Ensuite, la mémoire qu'elle occupe est 1024
1024
4, soit 4 Mo. Si inSampleSize est 2, alors l'image échantillonnée n'occupe que 512

512

4, soit 1 Mo (
Remarque : selon la dernière documentation officielle, la valeur de inSampleSize doit toujours être un exposant de 2, c'est-à-dire 1, 2, 4, 8, etc. Si l'entrée externe est inférieure à un exposant de 2, le système sélectionnez également l'index le plus proche de 2 par défaut. Remplacez par un index, tel que 2
    *)
    • considéré de manière globale. Les images peuvent être chargées efficacement via le taux d'échantillonnage. Le processus est le suivant
    • Définissez le paramètre inJustDecodeBounds de BitmapFactory.Options sur true et chargez l'image
    • Récupérez les informations de largeur et de hauteur d'origine de l'image auprès de BitmapFactory.Options, qui correspondent aux paramètres outWidth et outHeight
    • Selon le règles du taux d'échantillonnage et combinées avec les besoins de la vue cible La taille calcule le taux d'échantillonnage inSampleSize
      • Définissez le paramètre inJustDecodeBounds de BitmapFactory.Options sur false et recharger l'image

5. Mécanisme de recyclage de la mémoire et algorithme GC (les avantages de divers algorithmes Inconvénients et scénarios d'application); Principe de synchronisation du GC et objets GC

  • Réponse de référence :
    • Il existe deux mécanismes pour déterminer la recyclabilité des objets mémoire :
      • Algorithme de comptage de références : Ajoutez un compteur de référence à l'objet Chaque fois qu'il y a une référence à celui-ci, la valeur du compteur est incrémentée de 1 lorsque la référence devient invalide, la valeur du compteur est décrémentée de 1 ; les objets avec un compteur de 0 à tout moment. Ils ne peuvent tout simplement plus être utilisés. Cependant, l'algorithme de comptage de références n'est pas utilisé pour gérer la mémoire dans les machines virtuelles Java traditionnelles. La raison principale est qu'il est difficile de résoudre le problème des références circulaires mutuelles entre les objets, c'est pourquoi un autre algorithme de détermination de la survie des objets a été créé. émergé.
      • Méthode d'analyse d'accessibilité : Utilisez une série d'objets appelés "GCRoots" comme point de départ, recherchez vers le bas à partir de ces nœuds et recherchez le chemin Le chemin parcouru est appelée chaîne de référence Lorsqu'un objet n'a pas de chaîne de référence connectée aux racines GC, cela prouve que l'objet est indisponible. Parmi eux, les objets pouvant être utilisés comme GC Roots : les objets référencés dans la pile de la machine virtuelle, font principalement référence à des variables locales dans le cadre de la pile, et NatifObjets référencés par les méthodes, objets référencés par les attributs class static dans la zone des méthodes, objets référencés par les constantes * dans la zone méthode
    • Il existe quatre types d'algorithmes de recyclage de GC :
      • Algorithme de collecte générationnelle  : est actuellement Un algorithme utilisé par les machines virtuelles commerciales divise le tas Java en la nouvelle génération et l'ancienne génération en fonction des différents cycles de survie des objets, et utilise l'algorithme de collecte le plus approprié en fonction des caractéristiques de chaque génération .
      • Nouvelle génération : Un grand nombre d'objets meurent, et seuls quelques-uns survivent. Grâce à « l'algorithme de copie », seul un petit nombre d'objets survivants doivent être copiés.
        • Algorithme de copie : Divisez la mémoire disponible en deux blocs de taille égale en fonction de la capacité, et n'utilisez qu'un seul bloc à la fois. Lorsque ce bloc de mémoire est épuisé, « copiez » les objets survivants dans un autre bloc, puis nettoyez immédiatement ce bloc d'espace mémoire. Mise en œuvre simple et fonctionnement efficace. Lorsque le taux de survie des objets est élevé, davantage d'opérations de copie seront effectuées et l'efficacité deviendra moindre
      • Ancienne génération : Taux de survie des objets élevé. L'utilisation du « Mark-Sweep Algorithm » ou du « Mark-Sweep Algorithm » nécessite uniquement de marquer moins d'objets de recyclage.
        • Algorithme de marquage  : "marquez" d'abord tous les objets qui doivent être recyclés, puis "effacez" tous les objets marqués de manière uniforme. L'efficacité des processus de marquage et d'effacement n'est pas élevée. Après l'effacement, un grand nombre de fragments de mémoire discontinus seront générés. Un trop grand nombre de fragments d'espace peut entraîner un espace insuffisant lorsque des objets plus volumineux doivent être alloués pendant l'exécution du programme. . La mémoire contiguë doit déclencher une autre action de garbage collection à l'avance.
        • Algorithme de marquage-organisation  : "Marquez" d'abord tous les objets qui doivent être recyclés, puis "organisez-les" pour que les objets survivants sont tous déplacés vers une extrémité Déplacez-vous et enfin nettoyez directement la mémoire en dehors de la limite d'extrémité. L'algorithme de déflation des marques déplacera tous les objets vivants vers une extrémité et traitera les objets non vivants, de sorte qu'il ne produira pas de fragmentation de la mémoire
6. Quelle est la différence entre une fuite de mémoire et un débordement de mémoire ? Quels outils sont disponibles dans AS pour détecter les fuites de mémoire ?

    Réponse de référence :
    • Dépassement de mémoire (mémoire insuffisante)  : fait référence au moment où le le programme demande de la mémoire, il n'y a pas assez d'espace mémoire pour qu'il puisse l'utiliser et un manque de mémoire apparaît ; par exemple, si vous demandez un nombre entier, mais enregistrez un nombre qui ne peut être enregistré que par un long, il s'agit d'un débordement de mémoire. .
    • Fuite de mémoire : Cela signifie qu'une fois que le programme a demandé de la mémoire, il ne peut pas libérer l'espace mémoire appliqué. Les dommages d'une fuite de mémoire peuvent être ignorés, mais. la fuite de mémoire Les conséquences de la fuite et de l'accumulation sont très graves. Quelle que soit la quantité de mémoire disponible, elle sera occupée tôt ou tard. Une fuite de mémoire finira par entraîner un manque de mémoire !
    • Pour rechercher des fuites de mémoire, vous pouvez utiliser l'outil
    • AndroidProfiler fourni avec Android Studio ou MAT
7. Optimisation des performances, comment s'assurer que l'application démarre sans décalage ? Comment gérer l'écran noir et blanc ?

  • Réponse de référence :
    • La vitesse de démarrage de l'application dépend de ce que vous faites dans l'application, par exemple, vous intégrez beaucoup de sdk, et le sdk L'opération init doit être implémentée dans le thread principal, il y aura donc une sensation de décalage. Si cela n'est pas nécessaire, vous pouvez retarder le chargement ou activer le traitement des sous-threads
    • De plus, les deux principaux facteurs qui affectent le décalage de l'interface sont Le dessin de l'interface et informatique.
      • Optimisation de la mise en page (utilisation d'includes, de balises de fusion, ConstraintLayout est recommandé pour les mises en page complexes, etc.)
      • Aucune opération fastidieuse n'est effectuée dans onCreate( ) pour afficher la page La Vue est subdivisée et affichée progressivement dans AsyncTask Il est préférable d'utiliser Handler. De cette façon, l'utilisateur voit un affichage hiérarchique et étape par étape des vues. Il ne verra pas d'abord un écran noir, puis affichera toutes les vues en même temps. Il vaut mieux en faire une animation, l'effet sera plus naturel.
      • Le but de l'utilisation du multi-threading est de réduire autant que possible le temps de onCreate() et onReume(), afin que les utilisateurs puissent voir et utiliser la page le plus rapidement possible. .
      • Réduisez le temps de blocage du thread principal.
      • Améliorez l'efficacité d'Adapter et d'AdapterView.
    • La raison de l'écran noir et blanc : Lorsque nous démarrons une application, le système vérifiera si il existe déjà. Si un tel processus n'existe pas, le service système vérifiera d'abord les informations d'intention dans startActivity, puis créera le processus et enfin démarrera Actitivy, qui est un démarrage à froid. Le problème d’écran blanc et noir au démarrage survient durant cette période. Avant que le système ne dessine la page et charge la mise en page, il initialisera d'abord la fenêtre (Fenêtre). Au cours de cette étape, le système spécifiera la couleur de son thème en fonction du thème que nous avons défini. Les paramètres que nous avons définis dans Style déterminent la couleur affichée. . Est-ce un écran blanc ou un écran noir.
      • windowIsTranslucent et windowNoTitle, définissez les deux propriétés sur true (il y aura une expérience de décalage évidente, non recommandée)
      • Si la page de démarrage n'est qu'une image, définissez un nouveau thème spécifiquement pour la page de lancement, définissez l'attribut android:windowBackground du thème sur l'image d'arrière-plan de la page de lancement
      • Utilisez layer-list pour créer une image launcher_layer xml, définissez-la comme. arrière-plan du thème dédié de la page de lancement et définissez-le comme arrière-plan de la mise en page de la page de lancement.

8. La référence forte sera-t-elle recyclée si elle est définie sur null ?

  • Réponse de référence :
    • La mémoire occupée par l'objet ne sera pas libérée immédiatement. Si la référence de l'objet est définie sur null, cela déconnecte uniquement la référence à l'objet dans le cadre de pile de threads actuel, et le garbage collector est un thread exécuté en arrière-plan uniquement lorsque le thread utilisateur s'exécute vers le coffre-fort. point (point sûr) ) ou la zone de sécurité analysera la relation de référence de l'objet. Si l'objet n'est pas référencé, l'objet sera marqué à ce moment, la mémoire de l'objet ne sera pas libérée immédiatement car certains objets sont récupérables (la référence. est restauré dans la méthode finalize). La mémoire de l'objet ne sera effacée que lorsqu'il sera déterminé que la référence à l'objet ne peut pas être restaurée.

9. La différence entre ListView et RecyclerView

  • Réponse de référence :
    • Différence d'animation :
      • Dans RecyclerView, il existe de nombreuses API d'animation intégrées, telles que notifyItemChanged(), notifyDataInserted(), notifyItemMoved(), etc. pour personnaliser les effets d'animation, les effets d'animation personnalisés peuvent être complétés en implémentant (classe RecyclerView.ItemAnimator), puis en appelant RecyclerView.setItemAnimator(); ne pas implémenter d'effets d'animation, mais nous pouvons implémenter nous-mêmes l'effet d'animation de l'élément dans l'adaptateur
      • Différence de rafraîchissement :
      Habituellement, l'actualisation des données dans ListView utilise l'actualisation globale notifyDataSetChanged() consommera beaucoup de ressources ;
    • elle-même ne peut pas implémenter l'actualisation locale
    • , mais si vous souhaitez implémenter
    • actualisation partielle
    • dans ListView , cela peut toujours être réalisé lorsque les données d'un élément sont actualisées, nous pouvons implémenter une méthode onItemChanged() dans l'adaptateur, obtenir la position de l'élément dans la méthode (peut passer getFirstVisiblePosition()), puis appeler getView(. ) méthode pour actualiser les données de l'élément ;
      • Une actualisation partielle peut être implémentée dans RecyclerView, par exemple : notifyItemChanged();
      • Différence de cache :
      • RecyclerView a deux niveaux de cache de plus que ListView, prend en charge plusieurs caches ItemView distincts, prend en charge la logique de traitement du cache personnalisée des développeurs et prend en charge tous les RecyclerView partageant le même RecyclerViewPool (pool de cache).
      • Les mécanismes de mise en cache de ListView et RecyclerView sont fondamentalement les mêmes, mais l'utilisation du cache est différente
      • 10. Qu'est-ce que l'adaptateur de ListView
      Réponse de référence :
  • BaseAdapter : Classe abstraite dans le développement réel, nous hériterons de cette classe et réécrirons les méthodes associées. C'est l'adaptateur le plus utilisé !
  • ArrayAdapter : prend en charge les opérations génériques. L'adaptateur le plus simple ne peut afficher qu'une seule ligne de texte~
  • SimpleAdapter : Un adaptateur qui a également une bonne évolutivité et peut personnaliser une variété d'effets !
  • SimpleCursorAdapter : Une listView utilisée pour afficher des types de texte simples. Elle est généralement utilisée dans les bases de données, mais elle est un peu obsolète et n'est pas recommandée !

11. Comparaison des performances de LinearLayout, FrameLayout et RelativeLayout, pourquoi ?

  • Réponse de référence :
    • RelativeLayout appellera la sous-vue onMeasure deux fois. Lorsque LinearLayout a du poids, il appellera également onMeasure deux fois pour la sous-vue
    • Si la hauteur de la sous-Vue de RelativeLayout est différente de celle de RelativeLayout, cela entraînera des problèmes d'efficacité. Lorsque la sous-Vue est complexe, ce problème sera plus grave. Si possible, essayez d'utiliser un remplissage au lieu d'une marge.
    • Utilisez LinearLayout et FrameLayout au lieu de RelativeLayout sans affecter la profondeur de la hiérarchie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer