Intereting Posts

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