El uso de un HashMap para almacenar grandes cantidades de datos está ralentizando mi aplicación de Android, ¿hay otras opciones?

He escrito una aplicación de Android para mi escuela que genera un HashMap que asigna un nombre de curso a un ArrayList de las secciones disponibles para ese curso (Cuerdas). El mapa se genera usando JSoup para conectarse al sitio web de la escuela y obtener toda la información actual del curso, analizarla y formatearla, y crear HashMap> ().

Funciona. Sin embargo, toma literalmente alrededor 5 minutos para que el HashMap genere en un dispositivo androide. Soy un novato relativo en la programación y me preguntaba si hay otras maneras más eficientes de almacenar y de tratar con una cantidad tan grande de datos (el HashMap asigna a alrededor 800 ArrayLists, que a su vez contienen varias cadenas cada uno). Idealmente, los datos se actualizarán cada vez que se ejecute la aplicación, por lo que no estoy seguro de si escribir en el almacenamiento interno sería eficiente.

¿Alguna sugerencia?

Gracias

Edit: Aquí está el método que crea el HashMap. Es un poco complicado, pero el sitio web que estoy tirando de los datos de no fue fácil de trabajar.

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; } 

En primer lugar, esto:

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

La compilación de un patrón para cada iteración en un bucle for es subóptima.
Compile una vez al principio, y utilice el patrón compilado posteriormente.

También esto:

 build = build + s + ";"; 

Como la build es una cadena, concatenándola repetidamente creará nuevas cadenas en la memoria en cada iteración.
Considere el uso de un método de append StringBuilder en su lugar.

Dicho esto, estos temas no son lo suficientemente importantes como para ralentizar su proceso.

No hay suficiente información ahora mismo para que pueda notar rápidamente otros problemas obvios, sin embargo, parece que dependiendo del número de enlaces que se encuentran y, a continuación, el número de páginas descargadas, la mayor parte del tiempo se puede gastar en la lectura de la red Y analizar páginas HTML.

Es posible que desee utilizar una herramienta como http://developer.android.com/tools/debugging/debugging-tracing.html para ver qué está pasando.

  • El objeto se convierte en nulo
  • ¿Cómo mterp (Dalvik VM) organiza su bucle de interpretación de bytes?
  • Android - ¿Vale la pena ver ViewStub?
  • No se puede abrir el archivo open_gapps-arm-6.0-stock-20160220 en genymotion?
  • StackOverflowError al cambiar la visibilidad de la vista
  • Formato de audio apropiado para efectos de sonido en teléfonos Android con respecto a la eficiencia
  • Forma preferida de actualizar sqlite db en android
  • Rendimiento de animación de propiedades sobre animaciones de vista
  • Android desplácese hacia arriba ocultar vista y desplácese hacia abajo mostrar el efecto de vista como twitter
  • Android TextureView vs rendimiento de VideoView
  • Posible BUG en Android Clase ImageDownloader: sHardBitmapCache NO estática cuando debería ser?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.