Parse ~ 1 MB JSON en Android muy lento
Tengo un archivo de aproximadamente 1 MB JSON almacenado en mi carpeta de activos que necesito cargar en mi aplicación cada vez que se ejecuta. Me parece que el analizador JSON incorporado (org.json) analiza el archivo muy lentamente, sin embargo, una vez analizado, puedo acceder y manipular los datos muy rápidamente. He contado hasta 7 u 8 segundos desde el momento en que hago clic en la aplicación hasta el momento en el Activity1 se plantea, pero sólo unos pocos milisegundos para ir de Activity1 a Activity2, que depende de los datos procesados a partir de los datos cargados en Actividad 1.
Estoy leyendo el archivo en la memoria y analizándolo usando:
- Problema de bajo rendimiento de Phonegap
- ¿Cómo aumentar la velocidad del emulador?
- Mover instancias de Set a otro en Scala
- ¿Debo reemplazar las actividades de Android por fragmentos?
- ¿Por qué Android prefiere las clases estáticas?
String jsonString = readFileToMemory(myFilename) JSONArray array = new JSONArray(jsonString);
Donde readFileToMemory (String) tiene este aspecto:
private String readFileToMemory(String filename) { StringBuilder data = new StringBuilder(); BufferedReader reader = null; try { InputStream stream = myContext.getAssets().open(filename); reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); int result = 0; do { char[] chunk = new char[512]; result = reader.read(chunk); data.append(chunk); } while(result != -1); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return data.toString(); }
¿Alguien tiene alguna sugerencia de cómo puedo acelerar la carga inicial y el análisis de los datos? ¿Debo quizás enmascarar todo el proceso detrás de una pantalla de carga?
- ¿Qué podría hacer que una aplicación de Android se ejecute lentamente en un dispositivo idéntico a uno en el que corre rápido?
- Procesamiento lento de lotes de modelos en libGDX
- Android y OOP - Variables globales vs heredados Getters en fragmentos
- RecyclerView in DialogFragment -> arrastre y suelte (swap) retrasos de animación
- ¿Por qué el perro String.format de android es lento?
- No se puede abrir el archivo open_gapps-arm-6.0-stock-20160220 en genymotion?
- Android sólo descarga imágenes que son visibles en horizontalScrollView
- En Android; ¿Es mejor aplicar un OnClickListener o usar android: onClick?
JSONObject
– el de json.org, es el API más simple que se usa para analizar JSON. Sin embargo, viene con un costo – performace. He hecho extensos experimentos con JSONObject, Gson y Jackson. Parece que no importa lo que hagas, JSONObject (y por lo tanto JSONArray) será el más lento. Por favor, cambie a Jackson o Gson.
Aquí está el desempeño relativo de los dos
(Más rápido) Jackson > Gson >> JSONObject
(slowest)
Referir:
Jackson
Gson
Debe crear una tabla SQLite para almacenar los datos y moverlo de JSON a SQL la primera vez que se ejecute la aplicación. Como beneficio adicional, esto hace que los datos sean más fáciles de buscar y permite modificar los datos desde la aplicación.