以前は、ツリー構造を使用してこれを試していました。JSON 応答は約 3.5 MB であるため、この方法で解析しようとすると古いデバイスのメモリが不足することは理解できました。
私の質問は、ストリーミング JsonReader に切り替えた後も OutOfMemoryException が発生するのはなぜですか? sd カードの .json ファイルへの応答を保存し、そこから読み取ることもできるため、文字列をメモリに保存する必要はありません。
List<CurrencyPair> currencyPairs = new ArrayList<CurrencyPair>();
URL url = new URL("http://pubapi.cryptsy.com/api.php?method=orderdatav2");
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File(sdCard.getAbsolutePath() + "/zTrader");
directory.mkdirs();
File file = new File(directory, "cryptsy_response.json");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
BufferedWriter out = new BufferedWriter(new FileWriter(file));
char[] cbuf = new char[255];
while ((in.read(cbuf)) != -1) {
out.write(cbuf);
}
in.close();
out.close();
FileInputStream fis = new FileInputStream(file);
InputStreamReader fileInputStreamReader = new InputStreamReader(fis);
Reader bufferedReader = new BufferedReader(fileInputStreamReader);
JsonReader reader = new JsonReader(bufferedReader);
reader.beginObject();
Map<CurrencyPair, Integer> currencyPairs_MarketIds = new HashMap<CurrencyPair, Integer>();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("success")) {
reader.nextInt();
}
else if (name.equals("return")) {
reader.beginObject();
while (reader.hasNext()) {
String pairString = reader.nextName();
String[] currencies = pairString.split("/");
CurrencyPair currencyPair = new CurrencyPair(currencies[0], currencies[1]);
currencyPairs.add(currencyPair);
reader.beginObject();
while (reader.hasNext()) {
if (reader.nextName().equals("marketid")) {
Integer id = Integer.valueOf(reader.nextString());
currencyPairs_MarketIds.put(currencyPair, id);
}
else {
reader.skipValue();
}
if (sleep)
Thread.sleep(25);
}
reader.endObject();
if (sleep)
Thread.sleep(25);
}
}
}
reader.close();
file.delete();