Supere el cuello de botella de rendimiento de la vista personalizada

En las aplicaciones de Android, la vista personalizada es un requisito muy común. Las vistas personalizadas lo ayudan a crear elementos de interfaz de usuario únicos para satisfacer las necesidades específicas de su aplicación. Sin embargo, las Vistas personalizadas también pueden causar problemas de rendimiento, especialmente si su aplicación necesita manejar una gran cantidad de Vistas personalizadas.

En este artículo, exploraremos algunos consejos de optimización del rendimiento de vistas personalizadas de Android para garantizar que su aplicación siga siendo eficiente y estable cuando se trata de vistas personalizadas. Hablaremos de los siguientes aspectos:

1. Usa el diseño correcto

El diseño adecuado es fundamental al crear vistas personalizadas. Usar el diseño correcto puede ayudarlo a minimizar las jerarquías de diseño, lo que puede mejorar el rendimiento de su aplicación.

Por ejemplo, si necesita crear una vista personalizada con varias subvistas, usar ConstraintLayout en lugar de RelativeLayout y LinearLayout puede simplificar el diseño y reducir el anidamiento.

Aquí hay un código de muestra:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 添加您的自定义视图组件和约束条件 -->

</androidx.constraintlayout.widget.ConstraintLayout>

Otro truco de diseño importante es usar ViewStub. Un ViewStub es una vista liviana que se puede usar como marcador de posición y no se infla hasta que se necesita la vista real. Esto puede reducir en gran medida las jerarquías de diseño y mejorar el rendimiento.

2. Vista de caché

El almacenamiento en caché de las vistas es otro consejo importante para la optimización del rendimiento. Cuando usa una vista personalizada, generalmente necesita crear varias instancias. Si no almacena en caché estas instancias correctamente, su aplicación puede volverse muy lenta.

Para almacenar en caché las vistas, puede usar el patrón ViewHolder de Android o usar un objeto de caché personalizado. El patrón ViewHolder es una técnica muy utilizada por los desarrolladores de Android para mejorar el rendimiento en las vistas de lista o cuadrícula. El uso de un objeto de caché personalizado permite un mayor control sobre el ciclo de vida de la vista y reduce la creación y destrucción de la vista.

El siguiente es un código de muestra para el patrón ViewHolder:

class CustomView(context: Context) : View(context) {
    
    
    private class ViewHolder {
    
    
        // 缓存视图
        var textView: TextView? = null
        var imageView: ImageView? = null
        // 添加其他视图组件
    }

    private var viewHolder: ViewHolder? = null

    init {
    
    
        // 初始化ViewHolder
        viewHolder = ViewHolder()
        // 查找视图并关联到ViewHolder
        viewHolder?.textView = findViewById(R.id.text_view)
        viewHolder?.imageView = findViewById(R.id.image_view)
        // 添加其他视图组件的查找和关联
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制视图
    }
}

3. Evite operaciones de dibujo excesivas

Las operaciones de dibujo son uno de los problemas de rendimiento más importantes en las vistas personalizadas. Si su vista personalizada requiere muchas operaciones de dibujo, su aplicación puede volverse muy lenta.

Para evitar operaciones de dibujo excesivas, puede usar el método setWillNotDraw de View para deshabilitar el dibujo innecesario. También puede usar el método clipRect de Canvas para limitar el área de la operación de dibujo. Además, puede utilizar la aceleración de hardware para acelerar las operaciones de dibujo.

Aquí hay un código de muestra:

class CustomView(context: Context) : View(context) {
    
    
    init {
    
    
        setWillNotDraw(true) // 禁用绘制
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制操作
        canvas.clipRect(0, 0, width, height) // 限制绘制区域
        // 添加其他绘制操作
    }
}

4. Usar tareas asincrónicas

Si su vista personalizada necesita realizar operaciones que consumen mucho tiempo, como cargar imágenes de la red o procesar grandes cantidades de datos, debe usar tareas asincrónicas para realizar estas operaciones. Esto garantiza que su aplicación siga respondiendo y no bloquee la interfaz de usuario mientras realiza estas operaciones.

Aquí hay un código de muestra que carga una imagen usando una tarea asincrónica:

class CustomView(context: Context) : View(context) {
    
    
    private var image: Bitmap? = null

    fun loadImageAsync(imageUrl: String) {
    
    
        val asyncTask = object : AsyncTask<Void, Void, Bitmap>() {
    
    
            override fun doInBackground(vararg params: Void?): Bitmap {
    
    
                // 执行耗时操作,如从网络加载图像
                return loadImageFromUrl(imageUrl)
            }

            override fun onPostExecute(result: Bitmap) {
    
    
                super.onPostExecute(result)
                // 在主线程更新UI
                image = result
                invalidate() // 刷新视图
            }
        }

        asyncTask.execute()
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制图像
        image?.let {
    
    
            canvas.drawBitmap(it, 0f, 0f, null)
        }
        // 添加其他绘制操作
    }
}

5. Usa estructuras de datos apropiadas

En las vistas personalizadas, el uso de estructuras de datos adecuadas puede mejorar en gran medida el rendimiento. Por ejemplo, si necesita dibujar una gran cantidad de puntos o líneas, el uso de FloatBuffer o ByteBuffer puede mejorar el rendimiento. Si necesita procesar grandes cantidades de datos de imagen, el uso de BitmapFactory.Options puede reducir el uso de la memoria.

El siguiente es un código de muestra para dibujar puntos usando FloatBuffer:

class CustomView(context: Context) : View(context) {
    
    
    private var pointBuffer: FloatBuffer? = null

    init {
    
    
        // 初始化点的数据
        val points = floatArrayOf(0f, 0f, 100f, 100f, 200f, 200f)
        pointBuffer = ByteBuffer.allocateDirect(points.size * 4)
            .order(ByteOrder.nativeOrder())
            .asFloatBuffer()
        pointBuffer?.put(points)
        pointBuffer?.position(0)
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制点
        pointBuffer?.let {
    
    
            canvas.drawPoints(it, paint)
        }
        // 添加其他绘制操作
    }
}

en conclusión

En este artículo, exploramos algunas técnicas de optimización del rendimiento de View personalizadas de Android. Al usar el diseño adecuado, almacenar vistas en caché, evitar operaciones de dibujo excesivas, usar tareas asincrónicas y estructuras de datos adecuadas, puede asegurarse de que su aplicación siga siendo eficiente y estable cuando se trata de vistas personalizadas.

Recuerde que optimizar el rendimiento de su vista personalizada es un proceso continuo. Debe revisar su aplicación con frecuencia y utilizar las últimas tecnologías y mejores prácticas para mejorar el rendimiento.

por fin

Si desea convertirse en arquitecto o quiere superar el rango de salario de 20-30K, entonces no se limite a la codificación y los negocios, sino que debe poder seleccionar modelos, expandir y mejorar el pensamiento de programación. Además, un buen plan de carrera también es muy importante, y el hábito de aprender es muy importante, pero lo más importante es poder perseverar, cualquier plan que no se pueda implementar de manera constante es una palabrería.

Si no tiene una dirección, aquí me gustaría compartir con usted un conjunto de "Notas avanzadas sobre los ocho módulos principales de Android" escrito por el arquitecto principal de Ali, para ayudarlo a organizar el conocimiento desordenado, disperso y fragmentado de manera sistemática, para que que puede dominar de manera sistemática y eficiente los diversos puntos de conocimiento del desarrollo de Android.
inserte la descripción de la imagen aquí
En comparación con el contenido fragmentado que solemos leer, los puntos de conocimiento de esta nota son más sistemáticos, más fáciles de entender y recordar, y están organizados estrictamente de acuerdo con el sistema de conocimiento.

Conjunto completo de materiales de video:

1. Colección de entrevistas

inserte la descripción de la imagen aquí
2. Colección de análisis de código fuente
inserte la descripción de la imagen aquí

3. La colección de marcos de código abierto
inserte la descripción de la imagen aquí
invita a todos a apoyar con un clic y tres enlaces. Si necesita la información en el artículo, escanee directamente la tarjeta WeChat de certificación oficial de CSDN al final del artículo para obtenerla gratis ↓↓↓

PD: También hay un robot ChatGPT en el grupo, que puede responder a sus preguntas técnicas o de trabajo.

Supongo que te gusta

Origin blog.csdn.net/weixin_43440181/article/details/131089695
Recomendado
Clasificación