XML con la biblioteca SimpleXML – Rendimiento en Android
Estoy utilizando la biblioteca Simple XML para procesar archivos XML en mi aplicación de Android. Estos archivos pueden llegar a ser bastante grandes – alrededor de 1Mb, y se pueden anidar muy profundamente, por lo que son bastante complejos.
Cuando la aplicación carga uno de estos archivos, a través de la API simple, puede tardar hasta 30 segundos en completarse. Actualmente estoy pasando un FileInputStream en el método [read (Class, InputStream)] [2] de la clase Persister de Simple. Efectivamente, solo lee los nodos XML y mapea los datos a instancias de mis objetos de modelo, replicando la estructura de árbol XML en la memoria.
- El servidor no pudo procesar su solicitud. El valor no puede ser nulo: análisis de jabón
- Cómo cambiar el ancho de SwitchCompat thumb
- Cualquier herramienta para convertir la localización XML de Android en el archivo .strings del iPhone?
- Cómo asignar una lista de lista a RecyclerView
- Animación flotante suave con traducción en XML
Mi pregunta entonces es ¿cómo puedo mejorar el rendimiento en Android? Mi pensamiento actual sería leer el contenido del archivo en una matriz de bytes y pasar un ByteArrayInputStream al método de lectura de Persister en su lugar. Me imagino que el tiempo para procesar el archivo sería más rápido, pero no estoy seguro de si el tiempo ahorrado sería contrarrestado por el tiempo necesario para leer todo el archivo primero. También las restricciones de memoria pueden ser un problema.
¿Es esto un mandado de tontos? ¿Hay algo más que pueda hacer para aumentar el rendimiento en esta situación? Si no, sólo tendré que recurrir a la mejora de la retroalimentación al usuario sobre el progreso de la carga del archivo.
Algunas advertencias:
1) No puedo cambiar la biblioteca XML que estoy usando – el código en cuestión es parte de un "motor" que se utiliza en aplicaciones de escritorio, móviles y web. La sobrecarga para cambiarlo sería demasiado para el tiempo.
2) Los archivos de datos son creados por los usuarios por lo que no tienen control sobre el tamaño / profundidad de anidar en ellos.
- ¿Cómo puedo eliminar el fondo blanco de una vista web?
- No se encontró ningún identificador de recurso para el atributo 'layout_behavior' en el paquete
- ¿Cómo mostrar el diseño del menú en el diseño mainactivity en la ventana de vista previa en Android Studio?
- Cambiar la transición de navegación igual que Volver o Cerrar
- Disposición de la pantalla de preferencias de Android
- Java.lang.IllegalStateException Necesita utilizar un tema Theme.AppCompat (o descendente) con esta actividad
- Listview no muestra nada y ocultar datos
- ¿Buenas herramientas para desarrollar una GUI en Android?
Bueno, hay muchas cosas que puedes hacer para mejorar esto. Aquí están.
1) En Android usted debe utilizar por lo menos la versión 2.5.2, pero idealmente 2.5.3 como él utiliza KXML que es mucho más rápido y más memoria eficiente en Android.
2) Simple construirá dinámicamente su gráfico de objetos, esto significa que tendrá que cargar las clases que no se han cargado ya, y construir un esquema para cada clase basado en sus anotaciones usando la reflexión. Así que el primer uso será siempre el más caro. El uso repetido de la misma instancia persister será muchas veces más rápido. Así que trate de evitar varias instancias de persister, sólo use uno si es posible.
3) Trate de medir el tiempo necesario para leer el archivo directamente, sin utilizar la biblioteca Simple XML. ¿Cuánto tiempo se tarda? Si tarda una eternidad entonces usted sabe que el éxito de rendimiento aquí es debido al sistema de archivos. Intente utilizar un BufferedInputStream para mejorar el rendimiento.
4) Si todavía nota algún problema, levántelo en la lista de correo.
EDIT: Android tiene algunos problemas con el procesamiento de anotaciones https://code.google.com/p/android/issues/detail?id=7811 , Simple 2.6.6 correciones ha implementado arounds de trabajo para estos problemas. Se pueden observar aumentos de rendimiento de 10 veces.
- Cómo mostrar un ImageView progresivamente hacia abajo de arriba a abajo
- ¿Diversas vistas para el artículo del hilandero y del hilandero?