Низкая производительность на Android при реализации автономного словаря с использованием JsonReader
Я пытаюсь реализовать автономный словарь в приложении для чтения электронных книг, над которым я работаю.
Позвольте мне объяснить процесс. Словарь не является частью исходного приложения, скорее будет загружен в фоновом режиме. Исходные данные словаря - это json длиной 24 МБ, который впоследствии уменьшается до 6 МБ после сжатия.
Затем я загружаю сжатый JSON и распаковываю его на устройство. В словаре json содержится около 150000 записей, которые я сохраняю в БД. Я использую JsonReader для последовательного анализа json, добавляя каждую запись в БД.
Ниже приведен код для чтения json, разбора каждой записи и сохранения ее в БД (надеюсь, это говорит само за себя)
public void readFile() throws IOException {
File jsonInputFile = new File(DownloadClassHelper.getOfflineDictionaryDownloadPath());
InputStream inputStream = new FileInputStream(jsonInputFile);
JsonReader reader = new JsonReader(new InputStreamReader(inputStream, "UTF-8"));
try {
readArray(reader);
} finally {
reader.close();
}
}
public void readArray(JsonReader reader) throws IOException {
reader.beginArray();
while (reader.hasNext()) {
readObject(reader);
}
reader.endArray();
}
public void readObject(JsonReader reader) throws IOException {
String word = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("word")) {
word = reader.nextString();
} else if (name.equals("meanings") && reader.peek() != JsonToken.NULL) {
readMeaningsArray(word, reader);
} else {
reader.skipValue();
}
}
reader.endObject();
}
public void readMeaningsArray(String word, JsonReader reader) throws IOException {
reader.beginArray();
while (reader.hasNext()) {
readMeaningObject(word, reader);
}
reader.endArray();
}
public void readMeaningObject(String word, JsonReader reader) throws IOException {
String definition = null, pos = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("definition")) {
definition = reader.nextString();
} else if (name.equals("pos")) {
pos = reader.nextString();
} else {
reader.skipValue();
}
}
reader.endObject();
addWord(word, definition, pos);
Log.d(TAG, word + " | " + definition + " | " + pos);
}
/**
* Add a word to the dictionary.
* @return true or false if failed
*/
public boolean addWord(String word, String definition, String pos) {
ContentValues initialValues = new ContentValues();
initialValues.put(TableDictionary.COLUMN_WORD, word);
initialValues.put(TableDictionary.COLUMN_DEFINITION, definition);
initialValues.put(TableDictionary.COLUMN_POS, pos);
return CPWrapper.insert(TableDictionary.TABLE_NAME, initialValues);
}
Я сталкиваюсь с проблемой производительности моего текущего подхода, так как анализ всего json занимает около 30 минут.
Какой идеальный метод для реализации автономного словаря в приложениях Android? Нужно ли мне изменить мой текущий подход? Если да, то как мне идеально реализовать такую систему в Android.
Любые рекомендации / советы приветствуются.
1 ответ
Лучший способ - использовать предварительно заполненную базу данных для вашего приложения. Таким образом, вместо загрузки файла JSON, вы можете добавить файл базы данных в ваш apk в папке assets. Вы можете использовать Android SQLiteAssetHelper