Intereting Posts
ViewPager не всегда обновляется при вызове setAdapter, FragmentStatePagerAdapter Модернизация 2 / OkHttp: Отменить все выполняемые запросы Android – Анимируйте верхний вид ViewMargin / bottomMargin / etc в LinearLayout или RelativeLayout Программно добавляя эффект анимации к (программно добавленному) popupWindow в android Android JobScheduler: если вы планируете одну и ту же работу с периодическим временем, возобновляет ли она период? Внедрение библиотеки для отслеживания всех событий в приложении Интеграция Facebook в приложение для Android Как прослушать копию на Android «Системные изображения не установлены для этой цели», даже если изображение установлено Как получить Mat с возможностью ввода в Android с помощью OpenCV Центрировать вертикальное изображение текста в EditText Почему я получаю: threadid = 3: реагирует на сигнал 3 и замораживание игры (AndEngine)? GCM – Получение сообщения об ошибке «При обработке запроса произошла неизвестная ошибка. Повторите попытку "при создании нового проекта Используются ли ограничения API Карт Google для приложений Android? Уверены ли перезагрузки системы Android?

Использование HashMap для хранения больших объемов данных замедляет мое приложение для Android, есть ли другие варианты?

Я написал приложение для Android для своей школы, которое генерирует HashMap, который отображает имя курса в ArrayList доступных разделов для этого курса (строки). Карта создается с помощью JSoup для подключения к веб-сайту школы и получения всей текущей информации о курсе, анализа и форматирования и создания HashMap> ().

Оно работает. Тем не менее, буквально занимает около 5 минут для создания HashMap на устройстве Android. Я относительный новичок в программировании, и мне было интересно, есть ли другие, более эффективные способы хранения и обработки такого большого объема данных (карты HashMap составляют около 800 ArrayLists, которые, в свою очередь, содержат по несколько строк). В идеале данные будут обновляться каждый раз, когда приложение запускается, поэтому я не уверен, что запись на внутреннем хранилище будет эффективной.

Какие-либо предложения?

благодаря

Изменить: Вот метод, который создает HashMap. Это немного запутанно, но с сайта, с которого я извлекаю данные, было нелегко работать.

public HashMap<String, ArrayList<String>> generateCourseSectionMap() { ArrayList<String> store = new ArrayList<String>(); CourseLinks courses = new CourseLinks(); HashMap<String, String> courseLinks = courses.getCourseMap(); StringUtils util = new StringUtils(); HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>(); String sectionFormat = "((\\d){5};(\\d)+;(.*?) \\((.*?)\\);(.*?);(\\d)+ \\/ (\\d)+;(.*?);(TBA|Mo|Tu|We|Th|Fr|Sa|Su)+( (\\d){1,2}:(\\d){2}(AM|PM) - (\\d){1,2}:(\\d){2}(AM|PM))*?;(.*?));"; Document doc; try { for (Map.Entry<String, String> entry : courseLinks.entrySet()) { doc = Jsoup.connect(entry.getValue()).get(); Elements links = doc.select("*+tr>*:not(tr[class~=SectionTopic.*]>*):not(tr[class~=SectionTitle.*]>*)"); if (!links.isEmpty()) links.remove(0); String build = ""; for (Element e : links) { String s = util.trim(e.text()); if (!s.isEmpty()) build = build + s + ";"; } String rebuilt = rebuild(build); store = util.toArrayList(rebuilt.split("BREAK")); for (String d : store) { Pattern p = Pattern.compile(sectionFormat, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); Matcher m = p.matcher(d); String[] array = d.split(";"); String firstKey = d.substring(0, d.indexOf(";")); ArrayList<String> sectionList = new ArrayList<String>(); while (m.find()) sectionList.add(array[0] + ";" + array[1] + ";" + m.group()); map.put(firstKey, sectionList); } } } catch (IOException e) { e.printStackTrace(); } return map; } 

Прежде всего, это:

 Pattern p = Pattern.compile(sectionFormat, Pattern.CASE_INSENSITIVE | Pattern.DOTALL); 

Компиляция шаблона для каждой итерации в цикле for является субоптимальной.
Скомпилируйте его один раз в начале и затем используйте скомпилированный шаблон.

Кроме того, это:

 build = build + s + ";"; 

Поскольку build – это String, многократная конкатенация будет создавать новые строки в памяти на каждой итерации.
Вместо этого рассмотрите возможность использования метода append .

При этом эти проблемы не являются достаточно значительными, так как они замедляют ваш процесс.

Сейчас мне не хватает информации, чтобы быстро заметить дальнейшие очевидные проблемы, однако, похоже, что в зависимости от количества найденных ссылок и количества загружаемых страниц большую часть времени можно потратить на чтение из сети И разбор HTML-страниц.

Возможно, вы захотите использовать такой инструмент, как http://developer.android.com/tools/debugging/debugging-tracing.html, чтобы узнать, что происходит.