2012-08-29 23 views
5

Tengo un archivo JSON de aproximadamente 1 MB almacenado en la carpeta de mis activos que necesito cargar en mi aplicación cada vez que se ejecuta. Me parece que el analizador JSON integrado (org.json) analiza el archivo muy lentamente, sin embargo, una vez que se analiza, 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 que se activa Activity1, pero solo unos pocos milisegundos desde Activity1 hasta Activity2, que depende de los datos procesados ​​a partir de los datos cargados en Actividad 1.Parse ~ 1 MB JSON en Android muy lento

estoy leyendo el archivo en la memoria y analizarlo usando:

String jsonString = readFileToMemory(myFilename) 
JSONArray array = new JSONArray(jsonString); 

donde readFileToMemory (Cadena) es el siguiente:

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 hasta la carga inicial y el análisis de los datos? ¿Debo quizás enmascarar todo el proceso detrás de una pantalla de carga?

+0

Hay micro-optimizaciones que pueden hacer , como 'data.ensureCapacity (stream.available())' y hacer tus fragmentos 8K o 64K, etc., pero realmente lo que sería mejor sería serializar tus datos o guardarlos a una tabla SQL después del análisis, luego use eso, excepto si detecta que el archivo JSON se ha actualizado. –

Respuesta

2

Debe crear una tabla SQLite para almacenar los datos y moverlos de JSON a SQL la primera vez que se ejecuta la aplicación. Como beneficio adicional, esto facilita la búsqueda de los datos y posibilita la modificación de los datos desde la aplicación.

+0

Sí, pruebe SQLite o divida su JSON en pequeños. – neohope

8

JSONObject - el de json.org, es la API más simple para analizar JSON. Sin embargo, viene con un costo - rendimiento. He realizado 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 cambia a Jackson o Gson.

Aquí es el rendimiento relativo de los dos

(más rápido) Jackson > Gson >> JSONObject (más lento)

Consulte:
- Jackson
- Gson

+0

¿Se puede usar Jackson sin POJO? Como ahora estoy usando JSONObject, para leer el archivo json uno a uno, y hacer inserciones db - (Sin clases). ¿Puedo usar Jackson de la misma manera para leer json objects/array uno por uno y analizar, hacer inserciones db? –

+0

Sí. Por favor, lea la documentación aquí. http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

El enlace de Jackson está roto – VVB