2012-08-29 51 views
5

私は実行するたびに自分のアプリにロードする必要がある資産フォルダに約1MBのJSONファイルを保存しています。組み込みのJSONパーサ(org.json)は非常にゆっくりとファイルを解析しますが、解析後はすぐにデータにアクセスして操作できます。私は、Activity1が起動される瞬間までにアプリケーションをクリックしてから7〜8秒を数えましたが、アクティビティ1からアクティビティ2に移動するにはわずか数ミリ秒でロードされたデータから処理されたデータに依存しますアクティビティ1。Parse〜1 MB Android上のJSONは非常に遅い

私が使用してファイルをメモリに読み込み、それを解析しています:

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

readFileToMemory(文字列)は次のようになります。ここで

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

は、誰もが私が高速化することができますどのように任意の提案を持っていますデータの初期読み込みと解析を開始しますか?ローディング画面の背後にあるプロセス全体を隠すべきでしょうか?

+0

マイクロ最適化はあなたが作ることができますがあります
を:ここで

は2

の相対的なパフォーマンス(最速)Jackson > Gson >> JSONObject(最も遅い)

を参照してくださいです'data.ensureCapacity(stream.available())'のようにして、あなたのチャンクを8Kまたは64Kなどにすることができますが、実際にはデータをシリアル化したり保存したりする方がよいでしょう解析後にSQLテーブルに追加し、JSONファイルが更新されたことを検出した場合を除いてそれを使用します。 –

答えて

2

データを格納し、アプリケーションを初めて実行するときにデータをJSONからSQLに移動するには、SQLiteテーブルを作成する必要があります。これにより、データを簡単に検索できるようになり、アプリ内からデータを変更することが可能になります。

+0

はい、SQLiteを試したり、JSONを小さなものに分割したりしてください。 – neohope

8

JSONObject - json.orgのものは、JSONの解析に使用する最も簡単なAPIです。しかし、それはコストパフォーマンスを伴います。私はJSONObject、Gson、Jacksonで広範な実験を行ってきました。あなたが何をしていても、JSONObject(したがってJSONArray)が最も遅くなるようです。 JacksonまたはGsonに切り替えてください。 - Jackson
- Gson

+0

POJOなしでJacksonを使用することはできますか?私はJSONObjectを使用しています。私のjsonファイルを1つずつ読み込み、dbの挿入を行います - (クラスなし)。ジャクソンと同じ方法でjsonオブジェクト/配列を1つずつ読み込み、解析してdbを挿入することはできますか? –

+0

はい。ここのドキュメントをお読みください。 http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/ObjectMapper.html#readTree(java.lang.String) – Nishant

+0

ジャクソンリンクが壊れています – VVB