Code source commun pour les questions d'entrevue Android (deux): OkHttp, Retrofit, résumé de l'analyse du code source personnalisé Voir

Dans une attitude responsable vis-à-vis de l’entretien, enregistrez tous les points de connaissance du processus d’entretien, et non la série d’introduction, si vous ne comprenez pas, apprenez par vous-même.

À l'heure actuelle, les aspects suivants sont résumés:

  • Optimisation Android
  • Analyse HashMap
  • Analyse du code source du gestionnaire
  • Analyse OkHttp
  • Analyse de modernisation
  • Vue personnalisée

Pour des raisons d'espace, il est divisé en deux parties à partager. L' article précédent expliquait les trois premiers aspects, et aujourd'hui je parlerai des trois parties restantes, et les suivantes continueront d'être mises à jour.

Analyse OkHttp

Okhttp est un package pour Socket. Il existe trois classes principales, Request, Response et Call par défaut en utilisant new OkHttpClient () pour créer l'objet client initial.

Si vous avez besoin d'initialiser les paramètres de la requête réseau, tels que le délai d'expiration, l'intercepteur, etc., vous pouvez créer un générateur et créer l'objet client initial via builder.build ().

Utilisez le nouveau Request.Builder (). Url (). Builder () pour créer l'objet requst initial.

Créez un objet d'appel via client.newCall (), utilisez call.excute () de manière synchrone, appelez, mettez en file d'attente () de manière asynchrone. Ici, Call est une interface et l'implémentation spécifique est dans la classe d'implémentation RealCall.

L'efficacité d'Okhttp se reflète dans la classe Dispatcher dans okhttp, qui est un pool de threads géré en interne par okhttp, qui définit initialement le nombre maximum de connexions et le nombre maximum de visites d'hôtes. Maintenir 3 files d'attente et 1 pool de threads

readyAsyncCalls

La file d'attente des demandes d'accès en attente, qui stocke les demandes à exécuter.

runningAsyncCalls

File d'attente de demandes asynchrone, qui stocke l'exécution en cours, y compris les demandes annulées mais pas encore terminées.

runningSyncCalls

File d'attente de demandes synchrones, la demande en cours d'exécution, y compris la demande qui a été annulée mais pas encore terminée.

ExecutorService

Pool de threads, minimum 0, maximum Max thread pool

Lors de l'exécution de call.excute (), la méthode excute de la classe realcall est appelée. Il s'agit d'une méthode synchrone. La première ligne de la méthode est verrouillée et l'indicateur exécuté est jugé. S'il est vrai, une exception est renvoyée à assurer une demande exécutée une seule fois. Si faux, continuez l'exécution vers le bas. Appelez client.dispatcher.excute () pour entrer dans la classe du répartiteur et ajouter la requête actuelle à la file d'attente runningSyncCalls. La méthode terminée sera appelée à la fin de l'exécution

S'il s'agit d'une opération asynchrone, un objet RealCall.AsyncCall sera créé, l' interface NamedRunnable héritée par AsyncCall et NamedRunnable est un exécutable. Dans la méthode enqueue () de Dispatcher, commencez par évaluer les données de thread dans le pool de threads et le montant d'accès de l'hôte. Si aucun d'entre eux n'atteint, ajoutez-le à runningAsyncCalls et exécutez-le. Sinon, il est ajouté à la file d'attente readyAsyncCalls.
Méthode terminée, s'il s'agit d'une opération asynchrone, méthode modifyCall, utilisez l'itérateur pour parcourir readyAsyncCalls dans modifyCalls (), puis ajoutez-le à runningAsyncCalls

RealConnection

La classe d'opération de connexion réelle, le package soket, la sélection http1 / http2, le protocole ssl, etc. Une reconnexion est un lien

ConnectionPool

Le pool de liens gère les connexions http1 / http2. La même adresse partage une connexion pour réaliser la réutilisation des liens.

StreamAlloction

Informations de lien enregistrées, adresse, HttpCodec, realconnection, connectionpool et autres informations

Créez et démarrez la chaîne d'intercepteurs dans getResponseWithInterceptorChain () dans realCall

Les intercepteurs dans Okhttp sont divisés en 5 types par défaut

  • RetryAndFollowUpInterceptor
    effectue une reconnexion en cas d'échec du réseau, mais toutes les demandes ne doivent pas être reconnectées, selon le code de réponse. MAX_FOLLOW_UPS = 20 Nombre maximum
    de reconnexions Créez un objet StreamAllocation dans la méthode d'interception et appelez la méthode chain.proceed pour exécuter l'intercepteur suivant, traiter la demande et renvoyer la réponse.
  • Informations d'
    initialisation de BirdgeInterceptor , ajoutez des en- têtes de demande, tels que gzip, keep-alive et décompressez la réponse retournée

  • Il y a des classes Cache dans CacheInterceptor , qui gèrent les opérations de mise en cache, les classes internes d'intercache, l'algorithme disklrucache, etc. L'
    objectif n'est pas de mettre en cache les requêtes non-get.
    Classe de stratégie de cache CacheStrategy, obtenue via le mode usine
  • ConnectionInterceptor ( recommandé pour se concentrer sur la lecture du code source )
    établir un lien, utiliser le StreamAllocation créé précédemment, initialiser httpcodec, realConnection. Un algorithme similaire de nettoyage de marque gc est utilisé en interne pour marquer les connexions inutiles. StramAlloction devient progressivement 0. Le pool de threads est détecté et recyclé pour garantir plusieurs liens persistants sains.
  • CallServerInterceptor
    lance une requête réseau réelle, analyse les données renvoyées
    http et les écrit dans le flux IO réseau, et lit les données renvoyées au client à partir du flux IO réseau.
  • Intercepteurs de
    réseau Différence entre les intercepteurs d'application et les intercepteurs de réseau Voir les informations connexes
    okhttp wiki

Modèles de conception dans OkHttp

Singleton, constructeur, stratégie, chaîne de responsabilité, observateur

Penser:
la différence entre stratégie et usine simple

Questions d'entretien connexes:

  1. Démonstration du modèle de chaîne de responsabilité
  2. Processus de fonctionnement IO
  3. Parlons du processus de cache à trois niveaux
  4. Quelles sont les méthodes pour demander la configuration.
  5. Quelle est l'économie de la transmission avec reprise okhttp et comment réaliser le processus de transmission avec reprise

Analyse de modernisation

Modèles de conception impliqués

Mode apparence, mode constructeur, mode usine, mode agent, mode adaptateur, mode stratégie, mode observateur

Généraliser

Retrofit est une encapsulation d'un cadre de requête réseau. Okhttp, qui est utilisé par défaut pour la requête réseau sous-jacente, ne fait que simplifier la configuration des paramètres de la requête réseau de l'utilisateur. Il peut également être combiné avec Rxjava pour le rendre plus concis et plus pratique à utiliser .

  • L'application App demande le réseau via Retrofit, qui utilise en fait la couche d'interface Retrofit pour encapsuler les paramètres de demande, puis OkHttp termine les opérations de demande suivantes.
  • Une fois que le serveur a renvoyé les données, OkHttp fournit les résultats originaux à Retrofit et Retrofit analyse les résultats en fonction des besoins de l'utilisateur.
  • Conversion de données complète (converterFactory), adaptation (callAdapterFactory) et diverses extensions via des modèles de conception.

utilisation

    @GET("/user/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);

    //call封装了整个okhttp的请求

    Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("https://api.github.com/")
                        .addConverterFactory(GsonConverteractory.create())
                        //.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                        .build();
    //converterFactory
    //后续交个okhttp

Sept étapes pour utiliser Retrofit

  • Ajouter une dépendance Retrofit, des autorisations réseau
  • Définissez le Bean qui reçoit les données renvoyées par le serveur
  • Créer une interface pour les requêtes réseau, à l'aide d'annotations (proxy dynamique, cœur)
  • Le mode générateur crée des instances Retrofit, des convertisseurs, des calladapter ...
  • Créer une instance d'interface et appeler des requêtes réseau spécifiques
  • appel demande de réseau synchrone / asynchrone
  • Traiter les données renvoyées par le serveur

Rénovation de la communication réseau en huit étapes

  1. Créer une instance Retrofit
  2. Définissez l'interface de requête réseau et ajoutez des annotations aux méthodes dans l'interface
  3. Générer des objets de requête réseau via un proxy dynamique
  4. Adaptez l'objet de requête réseau à la plate-forme via l'adaptateur de requête réseau
  5. Envoyer une requête réseau (appel) via l'exécuteur de requête réseau
  6. Analyser les données via un analyseur de données
  7. Changer de thread via l'exécuteur de rappel
  8. L'utilisateur traite le résultat renvoyé sur le thread principal

Procuration

Fournir un proxy pour les autres objets pour contrôler l'accès à cet objet

  1. Statique

  2. dynamique

    • Mode agent créé lors de l'exécution du programme
    • Amélioration non invasive
    • proxy dynamique jdk vs cglib

proxy dynamique jdk

  • Uniquement pour la dynamique d'interface
  • InvocationHandler doit être implémenté
  • Obtenir des paramètres à partir des paramètres d'appel
  • La valeur de retour de invoke est renvoyée à l'utilisateur
  • InvocationHandler est passé dans newProxyInstance

Pour résumer:

  1. Durée
  2. Interface InvocationHandler et classe Proxy
  3. La différence entre proxy dynamique et proxy statique

Code source

  1. serviceMethonCache // Cache, objet de requête réseau
  2. Factory callFactory // par défaut ok
  3. HttpUrl baseUrl
  4. Lister <Converter.Factory> convertisseurFactories
  5. Liste <CallAdapter.Factory> callAdapterFactories
  6. Executor callbackExecutor // Exécuter le rappel
  7. boolean validateEagerly // S'il faut analyser immédiatement la méthode dans l'interface

constructeur

  1. Plate-forme

Singleton obtient
MainthreadExecutor sur différentes plateformes Plateforme Android

callAdapterFactory

Encapsulez l'appel d'origine via l'adaptateur d'appel pour trouver l'actionneur correspondant. Par exemple, l'Observable correspondant à rxjavaCallFactory, le formulaire de conversion Call <T> -> Observable <T>

convertisseurFactory

Le convertisseur d'analyse de données convertit la réponse dans le format de données correspondant, GsonConverterFactory, FastJsonConverterFactory via le converterFactory.

Rénovation

La classe principale Retrofit, qui fournit des interfaces externes. Créez une instance de mise à niveau et un mode d'apparence via retrofit.create (). Dans la méthode create (), le mode proxy dynamique est utilisé pour encapsuler la méthode dans l'interface demandée (ServiceMethod), et OkhttpCall est initialisé.

ServiceMethod

La classe de traitement de base, la méthode d'analyse et l'annotation, HttpRequest est générée dans la méthode toRequest (). Créer responseConverter (convertir le flux de réponse en chaîne ou entité), créer un callAdapter

OkhttpCall

Il s'agit d'un appel de package à okhttp3.

Vue personnalisée

Trois façons de personnaliser la vue, de combiner les contrôles existants, d'hériter des contrôles existants et d'hériter de la vue

Cet article se concentre uniquement sur la manière d'hériter de View et sur les deux autres auto-apprentissage.

1. Méthode de réécriture

onMeasure 、 onLayout 、 onDraw 、 onTouchEvent

onMeasure

Il peut être déclenché plusieurs fois. Faites attention à MeasureSpec pendant le processus de mesure. SpecMode et specSize
parlent du code source LinearLayout et RelativeLayout.

MesureSpec

MesureSpec , specMode 、 specSize

  1. EXACTEMENT

Indique que la mise en page parent espère que la taille de la mise en page enfant doit être déterminée par la valeur de specSize. Le système définira la taille de la mise en page enfant en fonction de cette règle par défaut. Bien entendu, les développeurs peuvent également la définir sur n'importe quelle taille selon leurs souhaits.

  1. AU PLUS

Indique que la sous-mise en page ne peut avoir au maximum que la taille spécifiée dans specSize. Les développeurs doivent définir cette mise en page aussi petite que possible et s'assurer qu'elle ne dépasse pas specSize. Par défaut, le système définira la taille de la sous-mise en page selon cette règle.Bien sûr, les développeurs peuvent la définir à n'importe quelle taille selon leurs souhaits.

  1. NON SPÉCIFIÉ

Cela signifie que les développeurs peuvent définir la mise en page à n'importe quelle taille selon leurs souhaits, sans aucune restriction. Ce genre de situation est relativement rare et rarement utilisé.

childParams / parentMode EXACTEMENT AU PLUS NON SPÉCIFIÉ
dp / px EXACTEMENT (taille enfant) EXACTEMENT (taille enfant) EXACTEMENT (taille enfant)
match_parent EXACTEMENT (taille parentale) AT_MOST (taille des parents) NON SPÉCIFIÉ (0)
wrap_content AT_MOST (taille des parents) AT_MOST (taille des parents) NON SPÉCIFIÉ (0)

Le graphique ci-dessus est tiré de https://blog.csdn.net/singwhatiwanna/article/details/38426471

onLayout

Dans le ViewGroup, il est déclenché une seule fois pour déterminer la position de la vue enfant

onDraw

Dessiner du contenu, Canvas.drawxxx (), peindre

onTouchEvent

Gestion des événements de clic

2. La différence entre une vue personnalisée et un groupe de vues

  1. onDraw (canevas)

Méthode utilisée pour le rafraîchissement dans la classe View. Cette méthode est une méthode utilisée par tous les View, ViewGroup et leurs classes dérivées. C'est également la méthode la plus importante pour le dessin de l'interface utilisateur Android. Les développeurs peuvent remplacer cette méthode et dessiner leurs propres graphiques et effets d'image en fonction du canevas de paramètre dans la méthode surchargée.

  1. onLayout ()

La surcharge de cette classe peut être personnalisée lorsque la disposition change, ce qui est très utile lors de l'implémentation de certains effets spéciaux. OnLayout in View n'a pas besoin d'être réécrit, onLayout () in ViewGroup est abstrait et ViewGroup personnalisé doit être réécrit.

  1. dispatchDraw ()

La classe ViewGroup et ses classes dérivées ont des méthodes qui contrôlent le dessin et la distribution des sous-vues. La surcharge de cette méthode peut modifier le dessin des sous-vues, puis réaliser des effets visuels complexes. Pour obtenir des exemples typiques, voir la surcharge dispatchDraw du Espace de travail du module Launcher.

  1. drawChild ()

La classe ViewGroup et ses classes dérivées ont des méthodes qui contrôlent directement le dessin d'une sous-vue spécifique d'un certain bureau, et la surcharge de cette méthode peut contrôler une sous-vue spécifique.

3. Afficher le processus d'exécution de la méthode

Trois mesures, deux mises en page et un dessin
http://blog.csdn.net/u012422440/article/details/52972825

Le nœud racine de l'arborescence de vues Android est DecorView, qui est une sous-classe de FrameLayout, donc ses sous-vues seront dessinées deux fois, donc la fonction onMeasure sera appelée deux fois en premier.

  • onResume (Activité)
  • onPostResume (Activité)
  • onAttachedToWindow (Affichage)
  • onMeasure (Voir)
  • onMeasure (Voir)
  • onLayout (Afficher)
  • onSizeChanged (Afficher)
  • onMeasure (Voir)
  • onLayout (Afficher)
  • onDraw (Afficher)
  • dispatchDraw ()

4. invalidate () 、 postInvalidate () 、 requestLayout ()

invalider()

/**
     * Invalidate the whole view. If the view is visible,
     * {@link #onDraw(android.graphics.Canvas)} will be called at some point in
     * the future.
     * <p>
     * This must be called from a UI thread. To call from a non-UI thread, call
     */
    public void invalidate() {
        invalidate(true);
    }

La méthode invalidate exécutera le processus de dessin et redessine l'arborescence de vues.
Lors de la modification de la visibilité, de l'arrière-plan, de l'état (focus / activer) de la vue, etc., ceux-ci appartiennent tous à la catégorie d'apparence et entraîneront l'opération d'invalidation. Besoin de mettre à jour l'affichage de l'interface, vous pouvez appeler directement la méthode invalider.

Remarque:

La méthode d'invalidation de l'appel de vue (classe non conteneur) ne se redessine que d'elle-même, l'appel de ViewGroup redessine l'arborescence de vue entière.

postInvalidate ()

/**
     * <p>Cause an invalidate to happen on a subsequent cycle through the event loop.
     * Use this to invalidate the View from a non-UI thread.</p>
     *
     * <p>This method can be invoked from outside of the UI thread
     * only when this View is attached to a window.</p>
     */
    public void postInvalidate() {
        postInvalidateDelayed(0);
    }

Appelé dans le thread enfant pour actualiser l'interface utilisateur.

requestLayout ()

 /**
     * Call this when something has changed which has invalidated the
     * layout of this view. This will schedule a layout pass of the view
     * tree. This should not be called while the view hierarchy is currently in a layout
     * pass ({@link #isInLayout()}. If layout is happening, the request may be honored at the
     * end of the current layout pass (and then layout will run again) or after the current
     * frame is drawn and the next layout occurs.
     *
     * <p>Subclasses which override this method should call the superclass method to
     * handle possible request-during-layout errors correctly.</p>
     */
    @CallSuper
    public void requestLayout() {
        }

Lorsque la largeur et la hauteur de la vue ont changé et qu'elle ne rentre plus dans la zone actuelle, appelez la méthode requestLayout pour redisposer la vue.
Lorsque la vue exécute la méthode requestLayout, elle revient à la vue parent de niveau supérieur, puis exécute la requête requestLayout de cette vue parent de niveau supérieur, de sorte que onMeasure et onLayout d'autres vues peuvent également être appelés.

Revoir l'itinéraire de l'entretien avec la grande usine

Je ne parlerai pas des mots supplémentaires. Ensuite, je partagerai un itinéraire d'examen pour l'entrevue. Si vous vous préparez également pour un entretien mais que vous ne savez pas comment procéder efficacement, vous pouvez consulter mon itinéraire d'examen. Si vous avez pour toute question, n'hésitez pas à communiquer les uns avec les autres.

Voici une direction pour que chacun apprenne systématiquement:

1. Regardez la vidéo pour l'apprentissage systématique

L'expérience de Crud au cours des dernières années m'a fait prendre conscience que je suis vraiment un combattant dans la rookie. C'est aussi à cause de Crud que ma technologie est relativement fragmentée et pas assez profonde pour être systématique, il faut donc réétudier . Ce qui me manque, c'est une connaissance du système, un cadre structurel et des idées médiocres, donc l'apprentissage par des vidéos est meilleur et plus complet. En ce qui concerne l'apprentissage vidéo, les individus peuvent recommander d'étudier à la station B. Il existe de nombreuses vidéos d'apprentissage sur la station B. Le seul inconvénient est qu'elles sont gratuites et facilement obsolètes.

De plus, j'ai moi-même collecté plusieurs séries de vidéos et je peux les partager avec vous si nécessaire.

2. Pour trier systématiquement les connaissances et améliorer les réserves

Il y a tellement de points de connaissance dans le développement du client, et il y a encore si peu de choses dans l'entrevue. Par conséquent, il n'y a pas d'autres astuces pour l'entrevue, juste pour voir à quel point vous vous préparez à ces points de connaissances. Ainsi, lorsque vous sortez pour une entrevue, il est bon de voir à quelle étape vous en êtes dans votre évaluation.

Direction d'apprentissage du système:

  • Compétences essentielles pour les architectes: génériques Java approfondis + annotations en langage simple + programmation simultanée + transmission et sérialisation de données + principes de machine virtuelle Java + réflexion et chargement de classe + proxy dynamique + IO efficace

  • Interface utilisateur avancée Android et code source FrameWork: promotion avancée de l'interface utilisateur + analyse du noyau du framework + noyau du composant Android + persistance des données

  • Optimisation des performances globales à 360 °: idées de conception et optimisation de la qualité du code + optimisation des performances du programme + optimisation de l'efficacité du développement

  • Interprétation des idées de conception de cadre open source: conception de réparation à chaud + interprétation de cadre de plug-in + conception de cadre de composant + cadre de chargement d'image + conception de cadre d'accès réseau + conception de cadre de programmation réactif RXJava + conception d'architecture IOC + composant d'architecture Android Jetpack

  • Développement de modules NDK: système de connaissances de base NDK + traitement d'image sous-jacent + développement audio et vidéo

  • Mini programme WeChat: introduction du mini programme + développement de l'interface utilisateur + opération API + station d'accueil WeChat

  • Développement hybride et Flutter: combat de projet Html5 + Flutter avancé

Une fois les connaissances triées, il est nécessaire de vérifier les points manquants, donc pour ces points de connaissances, j'ai préparé beaucoup de livres électroniques et de notes à portée de main.Ces notes fournissent un résumé parfait de chaque point de connaissance.

3. Lisez le code source, lisez les notes de combat et apprenez les idées de Dieu

"Le langage de programmation est la manière dont le programmeur exprime, et l'architecture est la perception du monde par le programmeur." Par conséquent, si les programmeurs veulent comprendre et apprendre rapidement l'architecture, la lecture du code source est essentielle. Lire le code source, c'est résoudre des problèmes + comprendre les choses, et plus important encore: voir les idées derrière le code source; les programmeurs disent: lire des milliers de lignes de code source et pratiquer des milliers de façons.

Inclut principalement le code source WeChat MMKV, le code source AsyncTask, le code source Volley, le code source Retrofit, le code source OkHttp, etc.

4. À la veille de l'entretien, questions de sprint

Dans la semaine précédant l'entretien, vous pouvez commencer à sprinter. Veuillez garder à l'esprit que lors du brossage des questions, la technologie est la première priorité et l'algorithme est basique, comme le tri, etc.

En ce qui concerne les questions d'entretien, j'ai personnellement préparé une série de questions d'entretien systématiques pour vous aider à apprendre les uns des autres:

Pour résumer

Il n'y a pas de raccourci pour changer votre vie. Vous devez suivre ce chemin vous-même. Seules une réflexion approfondie, une réflexion et un résumé constants, le maintien de l'enthousiasme pour l'apprentissage et la construction de votre propre système de connaissances complet étape par étape sont les moyens ultimes de gagner. est également la mission que les programmeurs devraient entreprendre.

Le contenu ci-dessus est gratuit à partager avec tout le monde, les amis qui ont besoin de la version complète, cliquez ici pour voir tout le contenu .

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44339238/article/details/112616741
conseillé
Classement