Все .class файлы в моем JAVA-приложении загружены в память после того, как приложение запустится?

Я делаю приложение для Android, в моем Действии я должен загрузить массив приблизительно 10 000 строк. Загрузка его от базы данных была медленной, таким образом, я решил поместить его непосредственно в один .java файл (как частное поле). У меня есть приблизительно 20 из этих классов, содержащих массивы строк, и мой вопрос, все классы загружаются в память после того, как мое приложение запущено? Раз так Действие, в котором мне нужны эти строки, было бы загружено быстро, но приложение в целом будет иметь медленный запуск... Есть ли другой путь, как к очень быстро загрузке 10 000 массивов строк из файла?

ОБНОВЛЕНИЕ: Почему мне нужны эти строки? Мое приложение для Android позволяет Вам находить "поездки" в общественном транспорте Праги - Вы выбираете исходную остановку, остановку прибытия, и это находит Вашу поездку (взгляните здесь). Мое приложение имеет функцию предложений - Вы вводите букву "c" как свою исходную остановку и предложения, ListView появляется с остановками, запускающимися с "c". Для этих предложений мне нужны строки. Выборка предложений от базы данных является медленной (приблизительно 400 мс на G1).

7
задан Cœur 21 November 2019 в 13:40
поделиться

4 ответа

Во-первых, 400 мсек на выполнение простого запроса к базе данных - это очень медленно. Настолько медленно, что я подозреваю, что есть какая-то проблема в схеме вашей базы данных (например, с индексами) или в конфигурации подключения к базе данных.

Но если вы серьезно относитесь к тому, чтобы не использовать базу данных, есть несколько альтернатив тому, что вы делаете в настоящее время:

  1. Настройте ленивую загрузку классов, содержащих массивы, по мере необходимости, используя Class.forName (...) . Если вы реализуете это правильно, сборщик мусора сможет восстановить классы после того, как они были загружены и строки были добавлены в вашу первичную структуру данных.

  2. Превратите 10000 строк в плоский файл, поместите его в файл JAR вашего приложения. Затем используйте Class.getResourceAsStream (...) , чтобы открыть файл и прочитать его в массиве в памяти.

  3. То же, что и выше, но с использованием индексированного файла и заменой массива структурой данных, которая позволяет вам лениво читать строки из файла. (Это будет немного сложно, но если вас беспокоит память, потребляемая 10000 строк, это поможет решить эту проблему.)

4
ответ дан 7 December 2019 в 05:22
поделиться

Класс загружается только при первом обращении.

Несмотря на то, что вам нужен массив из 10000, вам могут не понадобиться все сразу. Вот здесь и появляется понятие подкачки. Эта ссылка указывает на то, что Пейджинг часто выполняется в Android. Изначально в памяти есть только небольшой объем массива, и по мере необходимости продолжайте загружать его в память и выгружать все предыдущие данные из памяти, если они не нужны.

Например, в любой таблице, за один кадр, пользователь может увидеть в лучшем случае 50 записей, тогда ему придется прокручивать (учитывая, что его экран не размером с кинотеатр iMax). Когда он прокручивает, загрузите следующий фрагмент данных и выгрузите любые данные, которые сейчас не доступны пользователю.

3
ответ дан 7 December 2019 в 05:22
поделиться

Я не думаю, что вам понравится поддержка строк размером 10 КБ, жестко закодированных в файлах Java.

Скорее проверьте, правильно ли вы используете базу данных для решения своей проблемы и правильно ли установлены ваши индексы. Неправильный индекс может привести к очень низкой производительности.

Кроме того, вы должны ограничить количество результатов, возвращаемых запросом, но убедитесь, что вы не извлекаете записи по одной.

Если ничего не подходит, вы все равно можете предварительно загрузить строки из базы данных при запуске.

Вы можете предварительно загрузить, скажем, 10 записей для каждого символа. Если вводится символ, вы можете предварительно загрузить в записи этот символ, следующий за другим, и так далее.

0
ответ дан 7 December 2019 в 05:22
поделиться

Когда загружен тип? Это - удивительно сложный вопрос Ответ. Во многом это связано с тем, что значительная гибкость, по спецификации JVM, для JVM. внедрения. Загрузка должна быть выполненный до сшивания и сшивания должен быть выполнен до Инициализация. Спецификация ВМ делает оговаривать сроки Инициализация. Она строго требует чтобы тип был инициализирован на его первое активное использование (см. список того, что представляет собой "активный использование"). Это означает, что загрузка (и привязка) типа ДОЛЖНА быть выполнена в или до того, как этот тип стал первым активным использование.

С http://www.developer.com/java/other/article.php/2248831/Java-Class-Loading-The-Basics.htm

1
ответ дан 7 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: