Preguntas del estudio de Android 2021

Sobre los temas de estudio de la entrevista reciente

Lo siguiente es solo para referencia. La respuesta detallada no es única. Depende de su nivel de comprensión. Cuando hace clic en este blog, significa que ha movido su mente. ¡Le deseo mucho éxito!

¿Mecanismo de llamada onTouchEvent, onClick y onLongClick de Android?

Enlace: enlace detallado

Pregunta: (generalmente aparece junto con el mecanismo de distribución de eventos) ¿Qué método de presionar, levantar y mover el evento Click del botón y el evento LongClick en onTouch se ejecuta?

  • Respuesta: onTouchEvent es el primero en ejecutar eventos Down y Up, seguido de Click y LongClick.
    LongClick está en el método PostCheckForLongClick de Down. Cuando se ejecuta el evento de pulsación larga, el sistema activará una operación postDelayed. Si se pulsa durante más de 500 segundos, activará la ejecución en el hilo CheckForLongPress. Si se cumplen las condiciones, luego se ejecutará perFormLongClick ()., Llame a onLongClick () en este método;
    PerFormClick ejecuta el clic después de que ocurra Up, perFormClick primero llamará al método onClick del oyente registrado para ejecutarlo.

¿Cómo resolver el conflicto de eventos entre ScollView y Listview?

Enlace: enlace de detalles

  • Respuesta:
    1. La solución es heredar ListView, reescribir el método dispathTouchEvent, implementar Move y Down, establecer getParent (). RequestDisallowInterceptTouchEvent () en true en su operación y establecer getparent {}. RequestDisallowInterceptTochEvent () en Up y Cancel en false , Eso es todo;
    2. Herede ScollView para anular interceptTouchEvent, use getLocationInWindow para obtener la posición relativa de ListView, llame a los métodos getRawX y getRawy de MotionEvent para obtener las coordenadas de la pantalla, juzgue que ListView no es igual a nulo y configúrelo en falso al tocar el área de ListView, deje que el control secundario lo maneje.

¿Cuál entra en vigencia cuando Android establece el modo de inicio en el archivo de manifiesto o usa la configuración setFlags de la intención?

Enlace: enlace de detalles

Pregunta: (Suele aparecer con los cuatro modos de inicio) Supongamos que configuro el modo de inicio en el archivo de manifiesto o cuando uso la intención de inicio, ¿cuál entrará en vigor?

  • Respuesta: El efecto en el código es como establecer un color de fondo en xml y establecer otro en el código, debe ser un código dinámico que surta efecto.

¿Cuáles son las ventajas de Glide? ¿Cómo lograr un corte circular?

  • Respuesta: glide usa RGB_565, que usa llamada en cadena, se puede cargar progresivamente, usa caché de tres niveles, y primero encuentra imágenes en la memoria. Si existe, las mostrará. Si no existe, irá al disco para encontrarlo. Almacenado en la memoria, si no, vaya a la red para cargar, después de cargar, visualizar la imagen y transferirla al disco.

Cómo funciona el servicio?

  • Respuesta: Servicer tiene startServer y BindServer. StartServer siempre existirá en segundo plano después de que se inicie. El ciclo de vida de inicio es: onCreate–> onStartCommand–> onDestroy; BindServer existe con el ciclo de vida de Activity. Si la actividad se destruye, entonces onBindServer también se destruye, ciclo de vida: onCreate–>
    onBind–> onUnbind–> onDestroy.
    Diferencia: si startService () inicia el servicio, si la persona que llama sale directamente sin llamar a stopService, el servicio siempre se ejecutará en segundo plano.
    bindService () inicia el Servicio, la persona que llama y el Servicio coexisten y mueren

¿Hay solo un looper y messagequeen en el hilo del controlador?

  • Respuesta: solo hay un looper y un MessageQueen en el controlador.

¿Cómo realizar el primero en entrar, primero en salir de los mensajes múltiples entrantes en messagequeen?

  • Respuesta: Existe un mecanismo de bloqueo de sincronización en MessageQueen. Si se envía un mensaje al mismo tiempo, el sistema también determinará quién ingresó primero, y quien ingresó primero mantiene el bloqueo, logrando así el primero en entrar, primero en salir.

Hay varios controladores en una actividad. ¿Cómo distingue entre mensajes enviados por HandlerA o mensajes enviados por HandlerB?

  • Respuesta: Cuando el manejador envía un mensaje, llevará el objeto manejador correspondiente. Cuando el looper recupere el mensaje, llamará al mensaje en messageQueue. Esta vez llamará a enqueueMessage (), y luego lo asignará a msg.target , el controlador en este momento. Apunta al controlador actual.
  • Declaración incorrecta: se debe crear una instancia de Messageg antes de crear sendMessage. El Message instanciado tiene el método what, y métodos como arg1. Wait se usa para distinguir entre los mensajes recibidos por handlerMessage, y arg1 son los datos que se deben pasar.

¿Qué son las vistas personalizadas?

  • Respuesta: Herencia, autodibujo, combinado.

¿Cuáles son los métodos para personalizar el estilo de auto dibujo de la vista?

  • Respuesta: onMeasure: mide el tamaño de la vista, onLayout: mide la posición de la vista, onDraw: se usa para dibujar a sí mismo (fondo, contenido)

¿Cuáles son las pérdidas de memoria encontradas en el proyecto? ¿Cómo resolverlo?

  • Defina Handler como una clase interna estática, mantenga la referencia débil de Activity internamente y elimine todos los mensajes a tiempo.

¿Cuáles son las soluciones a las pérdidas de memoria?

  • La razón de la pérdida de memoria es que si un objeto de larga duración contiene una referencia de corta duración, es probable que se produzca una pérdida de memoria.
    Solución: use referencias débiles (recicladas cuando la memoria es insuficiente), la fuga causada por el modo singleton se puede pasar al contexto. ApplicationContext (), déjelo existir con la existencia de toda la aplicación y la fuga de memoria causada por los usos del controlador referencias débiles en procesamiento vacío en handlerMessage

¿Cuáles son las causas del desbordamiento de la memoria?

  • Respuesta:
    1. Desbordamiento de la memoria del tiempo de espera de recolección de basura (no se pueden recolectar objetos sin referencia durante mucho tiempo)
    Solución: Para reducir el ciclo de vida del objeto, la recolección de basura se puede llevar a cabo lo más rápido posible.
    2. Desbordamiento de la memoria del montón de Java (la memoria de jvm es demasiado pequeña, la memoria requerida por el objeto es demasiado grande)
    Solución: Primero, si no hay ningún problema con el código, puede ajustar adecuadamente los dos parámetros de jvm -Xms y -Xmx, y utilice pruebas de estrés para ajustar estos dos parámetros para alcanzar el valor óptimo.
    En segundo lugar, trate de evitar aplicaciones para objetos grandes, como la carga de archivos, y grandes lotes de adquisición de datos de la base de datos. Esto debe evitarse. Intente bloquear o procesar por lotes tanto como sea posible para ayudar a la ejecución normal y estable de la sistema.
  • Extensión: Memoria insuficiente: el entendimiento popular es que no hay suficiente memoria. Por lo general, cuando se ejecuta un software o juegos grandes, la memoria requerida por el software o el juego supera con creces la capacidad de la memoria instalada en su host, que se llama fuera de memoria.
    Pérdida de memoria: (Pérdida de memoria) se refiere a la memoria del montón que se ha asignado dinámicamente en el programa. Por alguna razón, el programa no se libera o no se puede liberar, lo que resulta en un desperdicio de memoria del sistema, lo que resulta en consecuencias graves como ralentización del programa e incluso un bloqueo del sistema.

¿Cuál es la diferencia entre la clase interna y la clase interna estática y la clase interna anónima?

  • Respuesta: 1. La clase interna puede acceder directamente a los métodos estáticos y no estáticos de la clase externa.
    2. La clase interna estática puede ser llamada directamente por otras actividades, pero solo puede acceder a los métodos estáticos y variables miembro de la clase externa.
    3. La clase interna anónima se implementa mediante herencia o interfaz, y debe inicializarse al mismo tiempo que la clase definida y la interfaz implementada.

¿Problema de sincronización de datos multiproceso?

Enlace: enlace de detalles

gson cadena al objeto correspondiente?

  • Respuesta: La deserialización del objeto se logra a través de fromJson () (es decir, la cadena json se convierte en un tipo de objeto)
    , y la serialización del objeto se logra a través de toJson () (es decir, el tipo de objeto se convierte en una cadena json).

¿Cuáles son los métodos de almacenamiento de datos de Android?

  • Respuesta: SQLite, sp, interfaz de carga, archivo local

¿Puede haber varios procesos en una aplicación?

  • Respuesta: Sí, configure un proceso en el archivo de manifiesto

¿Cómo lee el proceso A el contenido de almacenamiento del proceso B?

  • Respuesta: Utilice difusión o AIDL.

¿Cómo bloquea el hilo A el contenido de almacenamiento del hilo B?

  • Respuesta: Use Handler, constante global

¿Puede el hilo principal procesar varios mensajes al mismo tiempo?

  • Respuesta: Sí, si se envían varios mensajes en una actividad (el procesamiento de la CPU es nanosegundos / microsegundos), se pueden procesar. Establecemos la espera al crear el mensaje para distinguir los mensajes enviados por sendMessage. Use el interruptor para seleccionar en el trato de handlerMessage.

¿Cuál es la diferencia entre la abstracción y la interfaz de Java?

  • Respuesta: 1. Los métodos abstractos deben ser reemplazados por subclases. Los métodos abstractos no tienen cuerpos de método. 2. Los métodos implementados en interfaces son estáticos.
    3. Una actividad puede implementar múltiples interfaces, pero solo se puede heredar de una clase abstracta.

¿Cuál es la diferencia entre hilo y proceso?

  • Respuesta: Los procesos existen con la existencia de App. Puede haber varios subprocesos en un proceso. Si un subproceso falla, afectará a otros subprocesos, y si un proceso falla, no afectará a otros procesos. Por lo tanto, los procesos son más robustos que hilos.

¿Cuál es la diferencia entre esperar y dormir?

  • Respuesta: esperar es liberar el bloqueo y Sleep es mantener el bloqueo; esperar es el método de Object y Sleep es el método de Thread; sleep no ocupará la CPU, pero dejará otros hilos.

proceso de controlador?

Enlace: enlace de detalles

  • Respuesta: Handler.sendMessage envía el mensaje de mensaje a messagequeen. Messagequeen sondea los mensajes uno por uno a través de looper. Una vez que se recupera el mensaje, el mensaje se distribuirá a través del método dispathmessage y se enviará al handlerMessage correspondiente para actualizar la interfaz de usuario, etc. .

Supongo que te gusta

Origin blog.csdn.net/weixin_44781755/article/details/114970336
Recomendado
Clasificación