Entretien avec un ingénieur senior Android Combat réel, guide de saut d'emploi pour développeur Android sur le salaire de saut d'emploi doublé

Préface

Maintenant que la saison de recrutement est entrée, cet article vise à partager les méthodes d'entrevue et l'expérience des intervieweurs de sociétés Internet bien connues. J'espère que la lecture de cet article pourra donner aux programmeurs une expérience et des sentiments différents, assouplir la mentalité d'entrevue et se préparer activement pour la bataille!

Interviewer : Que sont les fils d'interface utilisateur?

R: Il est utilisé pour actualiser le thread où se trouve l'interface utilisateur

Interviewer : Parlez plus

R: L'interface utilisateur est actualisée dans un seul thread. Si plusieurs threads peuvent actualiser l'interface utilisateur, peu importe qu'il s'agisse d'un thread d'interface utilisateur ou non. L'avantage d'un seul thread est qu'il n'est pas nécessaire de se verrouiller partout dans le Le framework d'interface utilisateur et la synchronisation des threads sont simples et efficaces à écrire.

Interviewer : Ce fil d'interface utilisateur que vous avez mentionné, de quel fil s'agit-il? Est-ce le fil conducteur?

R: Prenez Activity comme exemple. Lorsque nous terminons des opérations fastidieuses de manière asynchrone dans Activity, nous pouvons appeler la méthode Activity.runOnUiThread pour actualiser l'interface utilisateur et l'exécuter dans le thread de l'interface utilisateur. Ensuite, nous saurons naturellement de quel thread est le thread de l'interface utilisateur. en regardant cette méthode.

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

Cette méthode déterminera si elle est actuellement dans le thread principal ou si elle sera lancée au thread principal pour être exécutée via mHandler. L'activité dans ce mHandler est une variable globale dans le temps Activity créée par un constructeur sans argument new Handler()pour créer ensemble.

Parce qu'il n'a pas de paramètres, quel thread est utilisé lors de sa création et quel thread est utilisé par Looper dans Handler. L'activité est créée dans le thread principal de l'application, donc le thread où mHandler.post est exécuté est également le thread principal. Je viens de dire que dans la méthode runOnUiThread, déterminez d'abord si elle est dans le thread d'interface utilisateur. Quand ce mUiThread est-il affecté? La réponse est toujours dans le code source de l'activité.

final void attach(Context context, ...) {
 ...省略无关代码
 mUiThread = Thread.currentThread();
}

Dans la méthode Activity.attach, nous attribuons le thread actuel à mUiThread. Quel type de thread est le thread actuel? C'est aussi le thread principal. Quant à savoir pourquoi la création d'Activité et l'attachement sont à la fois le fil principal, c'est une autre histoire. Grâce à l'analyse précédente, nous savons que pour Activity, le fil d'interface utilisateur est le fil principal

Interviewer : Donc, votre conclusion est que le fil de l'interface utilisateur est le fil principal?

R: Voici ce que vous avez dit. N'oubliez pas que vous ne pouvez pas vous tromper pendant le développement, mais ce n'est pas assez précis. Une exception sera levée lors de l'actualisation de l'interface utilisateur dans le thread enfant

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

L'idée générale est que seul le thread qui a initialement créé la hiérarchie View peut toucher la vue. Cela fait référence au thread dans lequel ViewRootImpl a été créé. À proprement parler, ce thread n'est pas nécessairement le thread principal. À ce stade, la même conclusion peut être obtenue en lisant la méthode View.post. Donc, pour View, le thread d'interface utilisateur est le thread où le ViewRootImpl a été créé, et le ViewRootImpl correspondant au DecorView de l'activité est créé sur le thread principal

Interviewer : Quand cette ViewRootImpl a-t-elle été créée

R: Une fois l'activité créée, le thread principal de l'application appellera ActivityThread.handleResumeActivity. Cette méthode ajoutera le DecorView de l'activité au WindowManger, qui est le ViewRootImpl créé à ce moment.

Interviewer : La vue peut-elle être actualisée dans un thread asynchrone?

R: Nous venons de dire que tant que le fil créé par ViewRootImpl peut toucher la vue, puis lorsque WindowManger.addView est créé, ViewRootImpl sera créé, nous devons donc uniquement appeler WindowManger.addView dans le fil enfant. actualisé dans ce thread enfant, ce thread enfant est le thread d'interface utilisateur de cette vue.

Interviewer : D'accord, parlons d'autre chose

Fin de phrase

J'ai résumé quelques points de connaissances de base d'Android , ainsi que certaines des dernières questions d'entrevue, des cartes cérébrales de connaissances et des analyses de données vidéo.

Les messages privés des petits partenaires dans le besoin [d'apprentissage] que je partagerai avec vous gratuitement, et j'espère que nous pourrons continuer ensemble à l'avenir. (Merci pour votre soutien continu, si vous en avez besoin, obtenez-le vous-même)

Vous pouvez également le recevoir en cliquant directement sur le lien!

Apprentissage Android PDF + vidéo d'architecture + document d'entretien + notes sources

Quelques informations en un coup d'œil:

  • 330 pages de notes de base d'apprentissage PDF sur Android (dont 8 sections)

  • Vidéo correspondante du système d'apprentissage Android

  • Matériel d'apprentissage correspondant au système avancé Android

  • Questions d'entretien Android BAT (analyse)

Matériel d'apprentissage correspondant **

[L'image du lien externe est en cours de transfert ... (img-n0iPM5Ph-1610954315224)]

  • Questions d'entretien Android BAT (analyse)

Je suppose que tu aimes

Origine blog.csdn.net/fanzhang_vip0723/article/details/112783458
conseillé
Classement