Red de conocimiento informático - Material del sitio web - Cómo optimizar el rendimiento de los clientes de Android

Cómo optimizar el rendimiento de los clientes de Android

La optimización del rendimiento es una categoría enorme y si alguien le pregunta cómo optimizar el rendimiento en Android, es posible que ni siquiera sepa por dónde empezar.

Lo primero que debemos entender es por qué nuestra aplicación necesita ser optimizada. El momento más obvio es cuando el usuario dice, qué carajo, no responde después de tanto tiempo usándola, así que desinstálala. .

¿Qué importa esto? Primero echemos un vistazo a la débil refutación: "No, el equipo del usuario es viejo y la red es mala. No es de mi incumbencia. No necesito ninguna optimización". Sin embargo, el jefe llama y presiona al CTO, y luego el CTO acude a ti: debes encontrar una manera de optimizarlo hoy, de lo contrario no podrás volver a casa.

Entonces, ¿por qué la aplicación parece retrasada, lenta y se comporta mal desde el aspecto de la interfaz de usuario? Intentemos diseccionarlo.

Fuera de tema: cambie minSDK a 4.0 o superior. Malditos usuarios de gama baja que ni siquiera están dispuestos a cambiar sus teléfonos. ¿Cuántas ganancias puede esperar que le brinde? El sistema anterior a 4.0 tiene muchos errores que no se pueden corregir y reducen el alto rendimiento general.

Bien, comencemos con la interfaz de usuario:

Lo primero que debemos comprender es el proceso de dibujo de la interfaz de usuario: medición-diseño-dibujo. La medición y el diseño requieren un bucle de todo. subcontroles y júntelos para completar el dibujo y el diseño. Por lo tanto, cuantos más subcontroles, más tiempo llevará (inflar, diseño_peso, relativo, anidamiento de múltiples capas, etc.) Es muy necesario reducir los subcontroles o capas innecesarios. El anidamiento de capas se puede reducir fusionando etiquetas de vistas. Si no tiene un gran sentido del espacio, puede comprobarlo utilizando la herramienta HierarchyViewer.

Para componentes de múltiples entradas como Listview o GridView, la reutilización de entradas puede reducir la cantidad de expansiones y lograr la reutilización a través de setTag y getTag ViewHolder. Cabe señalar aquí que es mejor reutilizar el titular antes de asignarlo. un valor Establezca controles para evitar que las imágenes y el texto estén desordenados.

Para el problema del primer retraso de visualización de ViewPager y el retraso de deslizamiento hacia la izquierda y hacia la derecha, existen varios métodos de optimización:

El número de páginas almacenadas en caché por ViewPager al mismo tiempo es preferiblemente el mínimo valor de 3. Si hay demasiadas, cuando se muestre por primera vez, ViewPager inicializará muchas páginas, por lo que el tiempo de representación acumulativo de la página aumentará y se verá muy estancada.

Cada buscapersonas solo debe cargar la red o base de datos (UserVisibleHint=true) cuando se muestra. Es mejor no cargar datos con anticipación para evitar desperdicios.

La imagen no se puede mostrar. o el tiempo de carga ¿Qué debo hacer si es demasiado largo? Dividido en dos partes, velocidad de descarga y velocidad de carga.

Para la descarga, es necesario controlar la cantidad máxima de tareas descargadas al mismo tiempo (la velocidad promedio es lenta) y será más rápido encapsular el InputStream con un flujo de búfer (como BufferedInputStream ).

En cuanto a la velocidad de carga, necesitamos saber una cosa, aunque la imagen descargada puede tener solo unos cientos de KB, la memoria ocupada después de decodificarla en un mapa de bits aumentará exponencialmente. Es fundamental reducirla. el tamaño de la imagen tanto como sea posible, por lo que dejar que el servidor proporcione imágenes con diferentes resoluciones es la mejor solución. Siempre habrá un momento en el que la memoria se agote. No crea que una resolución más alta será más clara. , solo hay espacio de 150*150. De hecho, solo hay un espacio de 150*150, por lo que no es apropiado hacer una imagen de 1000*1000. Además, en términos de velocidad de carga: memoria > disco duro > red, el uso racional de la memoria caché también es clave. Si no puede escribirlo usted mismo, no importa. Ahora existen muchos marcos de almacenamiento en caché de imágenes de código abierto, así que no se preocupe.

Hablando de almacenamiento en caché

Existen muchos tipos de almacenamiento en caché. No es necesario enumerarlos uno por uno. Hablaremos de ellos a medida que se utilizan.

Por ejemplo, hemos estado usando referencias fuertes y HashMap antes, pero luego descubrimos que ocupaba memoria, por lo que usamos referencias suaves y referencias débiles para recuperarnos a tiempo, porque el mecanismo de recuperación era incontrolable. Se introdujo lrucache, disklrucache, que utiliza algoritmos para equilibrar la memoria y el caché del disco duro. A medida que las versiones de Android avanzan y se desarrollan, también debemos aceptar los cambios. Si todavía hay referencias débiles o débiles en su aplicación, es posible que deba verificar nuevamente.

Por ejemplo, redes y bases de datos. Normalmente accedemos a Internet de forma proactiva y no pasiva. ¿Y qué pasa si los datos están duplicados o son inmutables? Entonces, ¿cuál es el punto de obtener datos de la red una vez? Mi solución es establecer un intervalo de solicitud máximo para cada actividad o fragmento o cada componente (como la vista de lista cuando se solicitan los datos por primera vez, guarde una copia en la base de datos y anote la marca de tiempo para la próxima vez que se reinicialice). , determine si excede el intervalo de tiempo máximo (por ejemplo, 5 minutos); de lo contrario, solo cargue los datos de la base de datos sin realizar una solicitud de red. Por supuesto, también existen algunos marcos de solicitud http implícitos que almacenan en caché los datos del servidor y ya no solicitan la red durante un cierto período de tiempo, o devuelven directamente datos previamente almacenados en caché cuando el servidor devuelve 304.

En resumen, también hablamos sobre la red, por lo que también dijimos

Hay muchos marcos HTTP listos para usar que podemos usar. Casi solo necesitamos escribir configuraciones para procesar. una solicitud de URL, pero hay muchas cosas que deben coordinarse con el servidor, como: formato de datos json, WebP en lugar de jpg, soporte para transmisión intermitente, múltiples solicitudes fusionadas en una, tratar de no redirigir, almacenamiento en caché del servidor y. equilibrio de carga.

En el propio cliente, además de implementar las funciones anteriores, también necesitamos almacenar en caché adecuadamente, controlar el número máximo de solicitudes simultáneas, cancelar solicitudes no válidas de manera oportuna, filtrar solicitudes duplicadas, establecer tiempos de espera, y establecer la prioridad de la solicitud.

La optimización no es un trabajo de una sola persona. Implementar una función es fácil, pero optimizarla y refactorizarla no lo es. Esto requiere mucha previsión y ajuste conjunto. Los supuestos y la práctica razonables son los medios más importantes de optimización.

Después de presentar estos puntos específicos, hablemos de algo de sentido común, que es lo que llamamos estándares de codificación.

Debe saber no declarar variables temporales en un bucle for y no escribir un try catch en él como último recurso.

Comprenda el mecanismo de recolección de basura para evitar GC frecuentes, pérdidas de memoria y OOM (hablaremos de ello más adelante)

Utilice tipos de datos de manera razonable, como usar StringBuilder en lugar de String (el La pregunta escrita más común es str="str" ​​​​tiene varios objetos), reduzca el uso de enumeraciones, reduzca el uso de declaraciones de clases principales (Lista, Mapa)

Si usa hilos nuevos con frecuencia Entonces es mejor implementar el grupo de subprocesos para reducir la sobrecarga de creación de subprocesos.

Es necesario comprender los beneficios de los singleton y utilizarlos correctamente.

Utilice más constantes, "action_key" menos explícita, mantenga una clase constante y no las declare repetidamente.

Si puedes, al menos comprende los patrones de diseño como la estrategia, la composición, los decoradores, las fábricas y los observadores. Pueden ayudarte a desacoplar las cosas de una manera razonable, de modo que incluso si tus necesidades cambian con frecuencia, puedas. No te preocupes porque afectará a todo el sistema. Los cambios en los requisitos no son terribles, lo terrible es la falta de diseño antes de escribir el código.

Por supuesto, hay muchos, muchos más. Lo que dijo Stay es solo un resumen, y aún debemos seguir intentándolo. Existe una gran diferencia entre los desarrolladores que pueden escribir código y los desarrolladores que pueden crear productos. Con solo tener una actitud, un agricultor puede obtener un 80% de código. Cuando encuentres algo que necesite optimización, ten paciencia y analízalo. La acumulación de tiempo te convertirá en un verdadero ingeniero.

Además, no existe la perfección absoluta en la optimización. Cada optimización se realiza en función del entorno actual. Debes comprender que la comunicación es la mejor optimización. No sigas a ciegas o casualmente, y piénsalo dos veces antes de actuar. .

¿Cómo optimizar el rendimiento en Android? Alguien que haya estado escribiendo código durante unos tres años básicamente te lo dirá.