ArrayAdapter de Listview Arregla () redibujo muy lento de notificydatasetchanged
Tengo una lista bastante simple con 3 campos textview en cada fila. Estamos actualizando sus valores cada 2 segundos o así con los datos procedentes de una llamada de webservice de fondo (AsyncTask)
Comparamos los valores que vienen con los actuales, los actualizamos en consecuencia en el Adaptador y finalmente llamamos a notifyDataSetChanged () si es necesario
- El buscapersonas de vista automática hace que los fotogramas se descarguen
- Apache Commons NET: ¿Debo crear un nuevo objeto FTPClient en cada conexión o reutilizar uno?
- Notificando un solo hilo: notify, notifyAll o concurrent.locks.Condition?
- Google Maps Android API v2 bloquea el subproceso de la interfaz de usuario
- Cómo mejorar el rendimiento de JS menú arrastrar en WebView en Android
La cosa es que el redibujo consigue realmente lento así colgando la UI entera cuando conseguimos más de 3 filas de la actualización inmediatamente. Por supuesto, estamos utilizando todas las optimizaciones bien conocidas ListView como el enfoque EfficientAdapter (setTag () y titulares), y getViewTypecount () / getItemViewType (). También hemos tratado de optimizar nuestra interfaz tanto como sea posible con layoutopt y tratando de evitar wrap_content anchos y alturas para aligerar las cosas.
No realizamos costosas operaciones en nuestras actualizaciones, solo cosas estándar: cambiar los valores de texto TextView, textcolor y backgroundcolor.
Lo único extraño que puedo ver es que getView () se llama 3-4-5 veces por cada fila, aunque he leído todos los mensajes de Romain [1] diciendo que no hay nada malo con eso
¿Alguna idea o sugerencia sobre cómo podemos acelerarlo?
¡Muchas gracias!
[1] http://groups.google.com/group/android-developers/browse_thread/thread/4c4aedde22fe4594/aeb04288064f495e?show_docid=aeb04288064f495e
- Desventajas en Multidexing la aplicación de Android
- ¿Dónde ejecutar algoritmos complejos? Lado del servidor o lado del cliente?
- Almacenamiento de datos de Android, Cuándo utilizar SqlLite y cuándo usar JSON, alternativas de Linq
- Anidado recylerview lag mientras que los primeros rollos y luego se desplaza suavemente?
- Obtener cuenta con cursor.getCount () o para ejecutar un rawQuery con un COUNT en una cláusula SQL?
- ¿Por qué el tipo primitivo corto es significativamente más lento que largo o int?
- Problema de bajo rendimiento de Phonegap
- La creación de clase Pojo desde el cursor Sqlite está tomando demasiado tiempo
Esto es para aquellos que navegan desde Google pensando que necesitan para reescribir su propio método de cambio de datos. Basado en mis datos, no es necesario para muchos casos.
notifyDataSetChanged()
puede ser MUCHO MÁS RÁPIDO que su reemplazo codificado a mano y todo depende de su implementación real de listview
.
Ejemplo: una lista de texto simple de 3 líneas con una fila máxima de 10K ArrayList
actualizada mediante la selección del menú.
Manual notifyDataSetChange()
--- avg run-time: 4ms
Predeterminado free notifyDataSetChange()
--- avg run-time: 0ms <--- you can't get faster than this.
No corra para crear su propio reemplazo a menos que el tiempo y el punto de referencia de sus cosas. Utilice las cosas gratis hasta que sea necesario.
Supongo que puede establecer una etiqueta para ur textView como la url de donde obtendrá la actualización. Y en lugar de llamar a "notifyDataSetChanged ()", puede intentar usar findViewByTag (URL de actualización) y setText para esa vista, por lo que la vista de texto sólo se repinta no toda la lista una y otra vez. Se reduciría suficientemente el número de repintados extra. Solo un pensamiento.
- Diferencias entre textMultiLine y textLongMessage
- Leer y grabar datos a través del puerto USB en Android 3.1