Una vez que la experiencia de la entrevista no convencional fabricante de OPPO (texto posdata a un gran número de preguntas de la entrevista)

Autor: AffyFei

REVISIÓN

Normalmente los fabricantes para entrevistar a algunos de los principios subyacentes deben preguntar, pero la entrevista fue contrario a la intuición para pedir algunos básicos, sino que también nos recuerda no perder la fundación. Final del artículo hay una gran cantidad de preguntas artículo cara, recordamos a ver, la experiencia es el autor de este artículo AffyFei, no yo, ver el texto siguiente:


Asistido esta mañana a la entrevista en Shenzhen OPPO ingenieros de desarrollo de la tecnología, todo el proceso de la entrevista no es muy suave. El entrevistador no le pidió algunos muy profundo principio subyacente, el fundamento básico e infraestructura son algunos de Java en Android cuatro componentes, pero no me valoran mucho su fundamento teórico en el proceso de desarrollo, lo que resulta en muchos puntos de conocimiento son olvidados. El proceso de la entrevista dura una hora, gracias a los dos entrevistador tomado la molestia de darme una pista, por un lado, de modo que en lo que puedo retrospección los conocimientos olvidados, también disminuyó la atmósfera de vergüenza. . .

Por cierto, el trabajo de seguridad OPPO se sigue haciendo bastante estricto, Houhai Zhuo en el centro del edificio antes de que la necesidad de solicitar un pase temporal para entrar. Y también es necesario registrarse antes de la entrevista, y la cámara delantera y trasera del teléfono dimos de pegarlos para realizar entrevistas. Sin más preámbulos, aquí se divide en dos partes resumen de lo que el conocimiento de la entrevista técnica.

lado de Java

1. ¿Cómo entender polimórfica de Java? Entre ellos, la sobrecarga y volver a escribir cuál es la diferencia?

El polimorfismo es la capacidad de tener varias formas o manifestaciones de la misma comportamiento diferentes, el polimorfismo es la misma interfaz, utilizando diferentes instancias y realizar diferentes operaciones, el polimorfismo se determina sólo durante la ejecución del programa, un punto de referencia variable a la que se va ejemplos de clases de objetos, esta variable de referencia llamadas de método realizadas en el extremo es que los métodos de clase implementadas.

Polimorfismo tres condiciones necesarias están presentes: la herencia, reescribir, las referencias a la referencia de subclases de la clase padre.

Tres aplicación polimórfica es: reescritura, interfaces, clases y métodos abstractos abstractos.

reescritura diferencia (Ignorar) y pesado (sobrecarga) de

2. memoria de la JVM para hablar de zonificación? ¿Qué parte es thread-pública, parte de la cual es privada?

área de memoria JVM se puede dividir en dos categorías: las discusiones privadas y regionales y puntos en común a la zona. Enhebrar áreas privadas: contador de programa, JVM pila de la máquina virtual, pilas de métodos nativos; área común hilo: montón, la zona método, conjunto de constantes de tiempo de ejecución.

  • Un registro contador de programa PC puede ser llamado. Cada hilo tiene un contador de programa privado, cada vez que hay sólo un hilo está ejecutando un método, que se llama el método actual. El contador de programa se almacena en la dirección de la instrucción JVM el método actual. Cuando las instrucciones de la CPU para ser ejecutados requieren dirección de la instrucción actualmente para ser ejecutado en la unidad de almacenamiento desde el contador de programa, y adquiere la dirección de la instrucción obtenida después de la obtención de la instrucción, el contador de programa se incrementa automáticamente en uno, o transferir el puntero obtenido según el siguiente una dirección de instrucción, y así sucesivamente, hasta la finalización de todas las instrucciones se ejecutan.
    JVM pila de la máquina virtual. tiempo de la creación del hilo creará una máquina virtual dentro de la pila de subprocesos, apilar una tienda con un marco de pila, lo que corresponde a una llamada a un método. máquina virtual JVM pila con dos operación, respectivamente empuje y saliente. marco de pila almacenada en la tabla de variables locales (variables locales), corriendo el stack (pila de operandos), apunta al método actual pertenece a la clase de la hora de referencia del grupo de constantes (Referencia a piscina runtime constante), el método devuelve la dirección (Remite) y alguna información adicional adicional.
  • montones de métodos nativos. Java pilas método nativo y pilas de papel y los principios son muy similares. La diferencia es sólo de Java pila es una implementación de Java de métodos para el servicio, y el método de pila local es implementar un método local (Método Nativo) servicios. En la especificación JVM, no hay lugar para este desarrollo del método específico y estructura de datos como requisito obligatorio, la máquina virtual es libre de ponerlo en práctica. Directamente puesto en uno de métodos nativos pilas y pilas de máquina virtual de Java HotSopt.
    Montón. gestión de memoria Heap es el área de la base, que se utiliza para almacenar una instancia de objeto. Casi todas las instancias de objetos creados se asignan directamente a la pila. Así montón de recolección de basura es el área principal, el recolector de basura tendrá un montón más subdivisiones, la más común es la pila se divide en la vieja y la nueva generación de. montón de Java no está permitido espacio continuo memoria física, siempre que lata lógica continua. Si no hay espacio para completar la excepción montón OutOfMemoryError serán arrojados asignación de instancia no se puede ampliar.
  • área de Métodos. Un método como región montón se ha cargado todos los hilos de la zona de memoria compartida para almacenar información de clase de la máquina virtual, una constante, las variables estáticas, el tiempo de compilador a código de compilación y otros datos. Además de los campos del archivo de clase, métodos, y la información de descripción de la interfaz y similares, así como una información de memoria constante para los símbolos literales generados durante el almacenamiento y referencia de compilación.

De hecho, además del contador de programa, la otra parte tendrá lugar OOM.

  • Montón. OOM pasará por lo general ocurre en el montón, probablemente la causa más común de OOM es una pérdida de memoria.
  • JVM pila de la máquina virtual y pilas de métodos nativos. Cuando escribimos un método recursivo, este método no es condición de terminación bucle recursivo el tiempo dará lugar a errores StackOverflow. Por supuesto, si falla la expansión espacio de pila, también se producirá el OOM.
  • área de Métodos. La zona método es ahora mucho menos OOM va a pasar, pero a la información de clase de carga situación OOM memoria es demasiado pronto para ocurrir.

3.final uso de palabras clave?

Usted puede modificarse variables y métodos de la clase final. clase de modificación representa la clase no puede ser heredada. Esta variable representa las variables modificadas no se pueden cambiar. Este método representa un métodos de modificación no se pueden sobrescribir (anulación).

4. estancamiento depende de cómo fueron? Cómo posicionar Punto muerto

Una tarea en espera de otra tarea, que a su vez está a la espera para otras tareas, por lo que seguir adelante hasta que el trabajo está en la cadena y la primera tarea está esperando para liberar el bloqueo. Este ha sido un bucle continuo entre las tareas en espera de uno al otro, ningún hilo puede continuar. Esto se llama punto muerto. Cuando se cumplan las cuatro condiciones siguientes, el punto muerto:

(1) Condiciones mutuamente exclusivos. tarea recursos utilizado en al menos uno no es compartida.

(2) La misión debe tener un recurso a la espera de acceso a los recursos y el otro es ocupadas por otras tareas.

(3) los recursos no pueden ser usurpadas.

(4) No deben esperar ciclo. Una tarea está esperando recursos en poder de otra tarea, que a su vez está a la espera de los recursos en poder de otras tareas, por lo que seguir adelante hasta que una tarea está esperando recursos en poder de la primera tarea que todos está bloqueado.

Para resolver el punto muerto, hay que romper las cuatro condiciones anteriores uno de ellos. En el programa, los más propensos a romper la frecuencia cuarta condición.

5. ¿Cómo actualizar la base de datos? SQLite adiciones y supresiones a la búsqueda del cambio de declaración básica de SQL?

/***Createahelperobjecttocreate,open,and/ormanageadatabase.*Thismethodalwaysreturnsveryquickly.Thedatabaseisnotactually*createdoropeneduntiloneof{@link#getWritableDatabase}or*{@link#getReadableDatabase}iscalled.**@paramcontexttousetoopenorcreatethedatabase*@paramnameofthedatabasefile,ornullforanin-memorydatabase*@paramfactorytouseforcreatingcursorobjects,ornullforthedefault*@paramversionnumberofthedatabase(startingat1);ifthedatabaseisolder,*{@link#onUpgrade}willbeusedtoupgradethedatabase;ifthedatabaseis*newer,{@link#onDowngrade}willbeusedtodowngradethedatabase*/publicSQLiteOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){this(context,name,factory,version,null);}publicSQLiteDatabasegetWritableDatabase(){synchronized(this){returngetDatabaseLocked(true);}}privateSQLiteDatabasegetDatabaseLocked(booleanwritable){.......db.beginTransaction();try{if(version==0){onCreate(db);}else{if(version>mNewVersion){onDowngrade(db,version,mNewVersion);}else{onUpgrade(db,version,mNewVersion);}}db.setVersion(mNewVersion);db.setTransactionSuccessful();}finally{db.endTransaction();}}

SQLiteOpenHelper constructor, la versión de un parámetro incluido. El parámetro que es la versión de la base de datos. Por lo tanto, aumentamos la base de datos se puede lograr mediante la modificación de la versión. Cuando una versión más grande que la versión de la base de datos original, se activará () ONUPGRADE, se puede escribir la lógica de actualización de base de datos en este método. Ejemplos específicos pueden referirse a la lógica de actualización de base de datos aquí.

Comúnmente se usa SQL CRUD:

Por: INSERT INTO nombre_tabla (columna 1, columna 2, ...) los valores (valor 1, valor 2, ....)
Eliminar: Eliminar en nombre de la tabla DONDE nombre de la columna = valor de
cambio: UPDATE nombre de la tabla nombre de la columna SET = el nuevo valor en el nombre de la columna = un valor
de verificación: nombres de selección de columna (el símbolo * es el comodín) de nombre de la tabla

ps: la tabla de datos de la operación es: ALTER TABLE. El comunicado añade a la lista existente, modificar o eliminar columnas.
La tabla nombre_tabla ADD nombre_columna Tipo de datos del ALTER
la nombre_tabla DROP ALTER TABLE La columna de
la ALTER TABLE RENAME table_name_old la A table_name_new

respeto Android

Clasificación 1.Broadcast? Ordenada y desordenada? Pegajosa, no pegajosa? difusión local?

  • Los programas de radio se pueden dividir en difusión ordenada y desordenada, difusión local, emisión persistente. En el que la transmisión de difusión por al azar sendBroadcast (intención), ordenada por transmisión de difusión sendOrderedBroadcast (intención).
  • Ordenada de difusión.
    (1) ordenados por emisión prioridad se puede ajustar rangos de prioridad -1000-1000, el valor predeterminado es 0, mayor es la prioridad mayor es el valor, mayor será la prioridad en la prioridad de una respuesta de difusión.
    (2) abortBroadcast () puede terminar la propagación de la emisión, el escudo de menor prioridad, la atención sólo tienen efecto de difusión ordenada.
    (3) Broadcast ordenó tales setResultData (), getResultData (), en el proceso de comunicación, el nuevo conjunto de datos puede ocurrir en la difusión de datos
  • Acerca de difusión local, puede ver este artículo. En, difusión local general a través de la incorporada en el LocalBroadcastManager Handler para lograr, sólo tiene que utilizar la función de concordancia IntentFilter, en cuanto a BroadcastReceiver reemplazado por otras interfaces no importa, por las clases camino y tomar ventaja de sólo el concepto de ready-made. Almacenado en el registro () y el tiempo correspondiente a la IntentFilter BroadcastReceiver, y encontrar el BroadcastReceiver Intención correspondiente en el sendBroadcast () cuando el mensaje se envía luego por Handler, lo que provocó executePendingBroadcasts () la función, la llamada correspondiente OnReceive BroadcastReceiver en este último () método.
  • existe mensaje de la viscosidad después de que el mensaje ha sido transmitido en el interior del sistema de recipiente, el procesador espera para el procesamiento correspondiente a, si no el procesador procesar temporalmente del mensaje en el mensaje que ha estado en un estado de espera en el interior del recipiente, si la viscosidad es transmitido del receptor: viscosidad Mensaje destrucción, recibirá automáticamente un mensaje cuando los datos entonces la siguiente reconstrucción. (En desuso androide 5,0 / api 21, ya no se recomiendan, así como la correspondiente viscosidad ordenada de difusión, también ha quedado en desuso)

El mecanismo de entrega de eventos 2.Android?

Cuando nuestro dedo toca la pantalla, el evento de acuerdo con la actividad física:> ViewGroup-> Ver este proceso para llegar a la respuesta táctil Ver evento final. En el caso de que el proceso de distribución, la participación de los tres métodos más importantes: dispatchTouchEvent (), onInterceptTouchEvent (), onTouchEvent. Nuestros dedos tocan la pantalla, dará lugar a un tipo de Action_Down caso, la Actividad de la página actual en primer lugar hará la apropiada, que vendrá dispatchTouchEvent Actividad en el método (). En este método tiene los dos lógica interna siguiente:

  • GetWindow.superDispatchTouchEvent llamada ().
  • Devuelve true si el paso vuelve directamente verdad, de lo contrario su regreso onTouchEvent (). Obviamente, cuando getWindow.superDispatchTouchEvent () devuelve verdadero, indica que el evento actual se ha consumido, sin llamar onTouchEvent, de lo contrario, en nombre del incidente no ha sido procesada, por lo que es necesario llamar a onTouchEvent Actividad para el procesamiento.
    Como todos sabemos, GetWindow () devuelve PhoneWindow, y por lo tanto pide a la PhoneWindow en la naturaleza superDispatchTouchEvent de este código (). Este último se llama en realidad mDecor.superDispatchTouchEvent (evento). El mDecor es DecorView, es una subclase de FrameLayout. SuperDispatchTouchEvent en DecorView en el (evento) se llama en super.dispatchTouchEvent (). Por lo tanto, la llamada es esencialmente ViewGroup de dispatchTouchEvent ().

En este caso, el evento ha pasado de la actividad a la ViewGroup. A continuación, analizamos ViewGroup.
En dispatchTouchEvent ViewGroup () de la lógica es la siguiente:

  • Por onInterceptTouchEvent () para determinar si la corriente por defecto ViewGroup intercepción ViewGroup no estén bloqueadas;
  • Si está bloqueado, y luego volver a su onTouchEvent ();
  • Si no ha sido interceptada, según child.dispatchTouchEvent () Devuelve el valor de la determinación. Si devuelve cierto, entonces de vuelta verdad, de lo contrario devolver su onTouchEvent (), donde hasta alcanzar los eventos sin procesar de transferencia.

Típicamente, ViewGroup de onInterceptTouchEvent () devuelve falso, dijo que no lo hicieron de intercepción. Cabe señalar que la secuencia de eventos, eventos tales como abajo, arriba eventos ... eventos, de abajo hacia arriba es una secuencia completa de eventos, desde el dedo correspondiente presionado para levantar esta serie de eventos, si ViewGroup interceptado Down caso, luego se entregan los hechos posteriores a esta onTouchEvent ViewGroup de. Si el interceptor no es caso ViewGroup hacia abajo, la vista cenital se ocupará de antes del evento para enviar un tipo Action_Cancel de evento, notificar niño Ver esta secuencia posterior de los acontecimientos se ha hecho cargo de ViewGroup, niño Ver estado anterior puede ser restaurado.

Para dar un ejemplo común: hay una gran cantidad de botón en un Recyclerview, primero pulsa un botón, y luego deslizar una cierta distancia y luego liberar, esta vez Recyclerview seguirá la diapositiva, y no se disparará evento de clic del botón. En este ejemplo, al pulsar el botón, el botón para Action_Down recibido evento, una secuencia posterior de los acontecimientos en circunstancias normales, si el proceso de este botón. Pero nos deslizamos a cierta distancia, a continuación, Recyclerview en cuenta que esta es una operación de diapositivas para interceptar esta secuencia de eventos, vaya a su método propio onTouchEvent (), se refleja en la lista de diapositivas en la pantalla. A continuación, pulse el botón mientras todavía en el estado, por lo que es necesario enviar un Action_Cancel a tiempo para interceptar antes de que el botón de notificación para restaurar el estado.

Ver la distribución de sucesos finalmente llegará a la dispatchTouchEvent () en. En vista de dispatchTouchEvent () no onInterceptTouchEvent (), donde es fácil de entender, Vista ningún niño, no habría ninguna intercepción. Vista de dispatchTouchEvent () devuelven directamente a su onTouchEvent (). Si onTouchEvent () devuelve verdadero representante del evento se consume, de lo contrario el evento no pasaría gastando hasta Ver procesa el evento o tener no consume, con el tiempo regresó a la actividad onTouchEvent () termina.

A veces alguien va a confundir onTouchEvent y onTouch. En primer lugar, estos dos métodos están a la vista de dispatchTouchEvent () en:

  • TouchListener retorno directo cierto si no es nulo, y la vista es habilitar y onTouch devuelve true, se reunieron, capaces de conseguir onTouchEvent método ().
  • De lo contrario, se disparará onTouchEvent (). Por lo tanto la prioridad onTouch para obtener el evento onTouchEvent discreción.

Por último, adjuntar un resumen de diagrama de flujo:

3.Handler principio?

Handler también está estrechamente relacionada con el mensaje, MessageQueue, Looper.

  • Mensaje. Mensaje Hay dos miembros clave de variables: objetivo, devolución de llamada:
    (1) objetivo. Handler es el envío de mensajes
    (2) de devolución de llamada. Ejecutables tipos de tareas entrantes al llamar Handler.post (Ejecutable). la naturaleza del evento posterior también creó un mensaje, asignar hacemos llegar este mensaje ejecutable a la creación de devolución de llamada de esta variable miembro.
  • MessageQueue. cola de mensajes para almacenar mensajes, que se centran en el método siguiente (), que devuelve el siguiente mensaje a ser procesado.
  • Looper. Looper mensaje poller está realmente conectado al núcleo y cola de mensajes Handler. Quiero crear un hilo en un Handler, por primera vez por Looper.prepare () para crear Looper, luego tuvo que llamar Looper.loop () para la votación abierta.
    (1) preparar (). Este método hace dos cosas: en primer lugar () Obtiene el Looper subproceso actual ThreadLocal.get, si no está vacío Lanza RuntimeException. De lo contrario, crear Looper, y por ThreadLocal.set (looper) del hilo del áncora actual fijaciones acaba de crear. Vale la pena señalar que la cola de mensajes anteriormente creado, de hecho, tienen lugar en Looper de constructores.
    (2) de bucle (). Este método abre todo el mecanismo de sondeo de eventos. Su esencia es abrir un bucle infinito, recibiendo constantemente el método mensaje MSG MessageQueue por el siguiente (). Msg.target.dispatchMessage llamadas reciben el mensaje () para hacer el procesamiento. En resumen, se está llamando handler.dispatchMessage ().
  • Handler. Manipulador de mensajes enfoque se envía y procesa el mensaje.
    (1) envía un mensaje. De hecho, además de enviar mensajes y correos allí sendMessage sendMessageDelayed y postDelayed y de diferentes maneras. Pero su esencia se llama sendMessageAtTime. Llamar enqueueMessage en sendMessageAtTime este método. EnqueueMessage hacer dos cosas en este enfoque: implementar un controlador de mensajes vinculados por el msg.target actual = esto. Queue.enqueueMessage luego se dio cuenta el mensaje en el equipo.
    (2) mensajes de procesamiento. El procesamiento de mensaje de la base es en realidad DispatchMessage () Este método. Este método, que es lógica muy simple, primero determina si nula msg.callback, y si no vaciar este se ejecuta ejecutable. Si está vacío se ejecutará nuestro método handleMessage.

Hay varias situaciones 4.ANR aparecen? ANR cómo analizar y resolver el problema?

ANR (La aplicación no responde). Android, el hilo principal (rosca UI) cae dentro de un tiempo predeterminado de la obra correspondiente no se procesa, aparecerá ANR. En concreto, la ANR aparecerá en los siguientes casos:

(1) el evento de entrada (las teclas y evento táctil) no ha sido tratado en 5s

(2) eventos BroadcastReceiver (método onRecieve) dentro del tiempo especificado no procesadas (en primer plano de difusión a 10s, emisión entre bastidores para los años 60)

(3) Servicio de los conocimientos previos 20s 200s fondo no se ha completado el arranque

(4) ContentProvider de no publicar ser completada dentro de 10 s

análisis de problemas ANR, requiere una combinación de los archivos de registro de seguimiento y.

5. ¿Cuáles son las pérdidas de memoria escena? herramientas de análisis de pérdida de memoria a utilizar?

pérdidas de memoria comunes son:

  • Singleton pérdidas de memoria causadas patrón.
  • Las variables estáticas que resulta en pérdidas de memoria.
  • las clases internas no estáticos debido a las pérdidas de memoria.
  • Cuando se utiliza recursos, causadas por una pérdida de memoria no es oportuna cerrada.
  • Utilice propiedad de animación causado por una pérdida de memoria.
  • WEBVIEW conducir a pérdidas de memoria.

En cuanto a la detección de fugas de memoria, herramientas de uso común LeakCanary, MAT (Memoria Analyer Herramientas), Android estudio cuenta con el Perfil. Para el uso de una gran cantidad de tutoriales en línea, auto-inspección, tomando como referencia los dos siguientes:

Tres usos, MAT

Al mismo tiempo, acompañado por el Android de perfiles Tutorial oficial

6. ¿Cómo lograr la optimización de empezar, qué herramientas se pueden utilizar?

Puesto de manifiesto la systrace esta herramienta, se detalla el uso puede referirse a los siguientes artículos:
https://blog.csdn.net/Kitty_Landon/article/details/79192377
https://www.cnblogs.com/baiqiantao/p/7700511.html
https://blog.csdn.net/xiyangyang8/article/details/50545707
https://blog.csdn.net/cxq234843654/article/details/74388328

7. ¿Cuáles son los patrones de diseño comunes? Ya sea que entender la cadena de patrón de responsabilidad?

Singleton, patrón de observador, el modo de fábrica, el Builder, patrón configurado por, el modo de intermediario, modo de puente, el modo de adaptador y similares.

resumen

Android de aprendizaje de vídeo en formato PDF + + + notas de la entrevista la documentación de código Arquitectura

Ahora mirar hacia atrás y hacer la pregunta no es difícil, sólo una cadena pidió a cabo una gran cantidad de datos relacionados con el conocimiento. Desde esta perspectiva, el desarrollo diario también es necesario prestar atención a la fundación. Especialmente para la experiencia de desarrollo es 1--5 años de desarrollo de Android, la mayor parte del entrevistador examinó si la firma es la base de conocimientos, habilidades de comunicación, capacidad de síntesis. Aunque esta entrevista amarillo, pero después de todo, una muy buena experiencia.

En este también comparto un hermano mayor él incluido terminar la notas + Video + Entrevista + fuente documento de estudio de arquitectura Android PDF , así como la arquitectura técnica avanzada Brain Mapping, entrevista androide con el desarrollo temático, materiales avanzados arquitectura avanzada para ayudarle a mejorar el aprendizaje avanzada, ahorrando a todos tiempo en línea en busca de información para aprender, también se puede compartir con amigos cercanos estudiar juntos

Si usted tiene una necesidad, se puede señalar como comentario + , me preocupa , además Vx: 15388039515 (Nota CSDN, información de necesidad)

Publicados 200 artículos originales · ganado elogios 83 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_45258969/article/details/103996239
Recomendado
Clasificación