2012-08-29 6 views
5

Ich habe eine ungefähr 1MB JSON-Datei in meinem Assets-Ordner gespeichert, die ich in meiner App jedes Mal laden muss, wenn es ausgeführt wird. Ich finde, dass der eingebaute JSON-Parser (org.json) die Datei sehr langsam analysiert, aber sobald ich geparst habe, kann ich sehr schnell auf die Daten zugreifen und sie manipulieren. Von dem Moment an, in dem ich auf die App klicke, habe ich bis zu dem Moment, in dem Activity1 aufgerufen wird, 7 bis 8 Sekunden gezählt, aber nur wenige Millisekunden von Activity1 zu Activity2, die von Daten abhängen, die von den geladenen Daten verarbeitet werden Aktivität 1.Parse ~ 1 MB JSON auf Android sehr langsam

ich die Datei in den Speicher einzulesen und Parsen es mit:

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

wo readFileToMemory (String) sieht wie folgt aus:

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(); 
} 

Hat jemand irgendwelche Vorschläge, wie ich beschleunigen kann bis zum ersten Laden und Parsen der Daten? Sollte ich vielleicht den ganzen Prozess hinter einem Ladebildschirm maskieren?

+0

Es gibt Mikro-Optimierungen Sie können machen , wie 'data.ensureCapacity (stream.available())' und machen Sie Ihre Stücke 8K oder 64K, etc., aber was wäre besser wäre serialisieren Ihre Daten oder speichern Sie sie zu einer SQL-Tabelle nach dem Parsen, dann verwenden Sie das außer, wenn Sie feststellen, dass die JSON-Datei aktualisiert wurde. –

Antwort

2

Sie sollten eine SQLite-Tabelle erstellen, um die Daten zu speichern und sie bei der ersten Ausführung der Anwendung von JSON nach SQL zu verschieben. Ein weiterer Vorteil ist, dass die Daten einfacher zu durchsuchen sind und Sie die Daten in der App ändern können.

+0

Ja, versuchen Sie SQLite oder teilen Sie Ihre JSON auf kleine. – neohope

8

JSONObject - die von json.org, ist die einfachste API, um JSON zu parsen. Aber es kommt mit einer Kosten - Leistung. Ich habe umfangreiche Experimente mit JSONObject, Gson und Jackson gemacht. Es scheint egal, was Sie tun, JSONObject (und damit JSONArray) wird am langsamsten sein. Bitte wechseln Sie zu Jackson oder Gson. Hier

ist die relative Leistung der beiden

(schnellste) Jackson > Gson >> JSONObject (langsamsten)

Siehe:
- Jackson
- Gson

+0

Kann Jackson ohne POJOs verwendet werden? Ab sofort benutze ich JSONObject, um meine json-Datei einzeln zu lesen und db-Einfügungen zu machen - (Keine Klassen). Kann ich die Jackson-Methode verwenden, um JSON-Objekte/Arrays einzeln zu lesen und zu analysieren, db-Einfügungen zu machen? –

+0

Ja. Bitte lesen Sie die Dokumentation hier. http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

Jackson Link ist kaputt – VVB