Intereting Posts
Android Studio 2.2 Preview 3 Ошибка компоновки Платеж Android in-app возвращает код ответа сервера 2. Что это значит? Уведомление Google Play о том, что обновление приложения недоступно, надежно. Я что-то упускаю? Царство: создавать отношения с помощью идентификаторов Быстрая сборка на Android с eclipse Как заполнить каждую сторону куба различными текстурами на OpenGL ES 1.1? Android – фильтрация Google Play xxhdpi Как нажимать на элемент внутри RecyclerView в Espresso Универсальный графический загрузчик изображений мигает после уведомления о вызове DataSetChanged Изменения разрешений манифеста при развертывании новой версии приложения Почему важно устанавливать полезную нагрузку разработчика с помощью биллинга в приложении? Приоритетный приоритет приема широковещательного приемника Создание многостраничного почтового запроса со сжатым массивом байтов jpeg с пружиной для android Удалить будильник из AlarmManager с помощью функции cancel () – Android Android: получить html веб-сайта определенное время после запроса

Использование 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, чтобы узнать, что происходит.