Низкая производительность на 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

Другие вопросы по тегам