App hängt bei vielen Einträgen in der for Schleife

  • Hallo,


    ich habe folgenden Code:



    Ich habe das Problem, dass in der for-Schleife bei ungefähr 200 Datensätzen die App für 3-4 Sekunden hängt.


    Gibt es eine Möglichkeit, diese Datensätze erst dann hinzuzufügen, wenn das GUI geladen ist?


    Oder habt ihr noch andere Ideen, um die for-Schleife schneller zu machen.


    Das Problem macht folgende Zeile NICHT:

    Code
    ArrayList<ReadEvent> alldatesmonthly_init_previous = events.getAllEventsByMonth(c1_init_previous2, c2_init_next);


    Sondern: Es ist die for-Schleife. Keine Ahnung, wie ich sie beschleunigen kann.


    Am besten wäre es, wenn die Methode addAllEvents() im Hintergrund laufen würde. Wie kann ich das anstellen?

  • hallo richtig ist das man so Zeitaufwendige Sachen in einen separaten thread ausführt. Dazu musst du deine Methode ziemlich umbauen. Denn du fürst ja in der For schleife auch zugriffe auf die GUI Ui thread aus.
    Wie viele Layouts erzeugst du eigentlich die Methode showpopup wird ja fast bei jeden schleifendurchlauf aufgerufen. Kannst du das nicht mit einer listview machen ?

  • hallo richtig ist das man so Zeitaufwendige Sachen in einen separaten thread ausführt. Dazu musst du deine Methode ziemlich umbauen. Denn du fürst ja in der For schleife auch zugriffe auf die GUI Ui thread aus.
    Wie viele Layouts erzeugst du eigentlich die Methode showpopup wird ja fast bei jeden schleifendurchlauf aufgerufen. Kannst du das nicht mit einer listview machen ?


    Das sind etwa 100 Layouts. ListView geht leider nicht, weil die 100 Layouts untereinander, bzw. nebeneinander angeordnet werden müssen.

  • Hallo, hier ein Screenshot:



    Aber auch wenn ich bloß ein TextView hinzufüge (also ohne das ganze LinearLayout-Gedöns), dann dauert es auch 3-4 Sekunden.



    Mein Wunsch wäre es unter 1,5 Sekunden zu kriegen oder, dass die Termine im Hintergrund hinzugefügt werden.



    Ich bin mir auch nicht sicher, was so lange dauert.



    Es passiert vor allem, wenn Termine sich wiederholen (also wenn RRULE gesetzt ist).

  • hi so ein layout müsste sich doch mit der neueren Version der listview dem recyclerview als grid hinzukriegen sein . Oder vielleicht als gridlayout.
    Du solltest den Code so schreiben das du nicht in der for schleife auf die GUI zugreifst dann kannst du die schleife auch im Hintergrund in einem extra thread laufen lassen.


    Ps. wieso zeigst du mehr als einen Monat an wenn du auf Monat bist? Schränke deine suche ein sowie es die Kalender app auch machen. Dann hast du auch keine200 Datensätze .

  • Du solltest den Code so schreiben das du nicht in der for schleife auf die GUI zugreifst

    Wie meinst du das? Wie kann ich denn ohne die for-Schleife auf die GUI zugreifen?



    Ps. wieso zeigst du mehr als einen Monat an wenn du auf Monat bist? Schränke deine suche ein sowie es die Kalender app auch machen. Dann hast du auch keine200 Datensätze .

    Naja, dann sind es aber auch nur 11 Tage weniger. Ich zeige sie deswegen an, weil ich sonst leere Spalten hätte und das wäre nicht so elegant ;)

  • Von wo bekommst du eigentlich deine Daten ? Aus einer SQL.
    Ich meine du sollst die anzuzeigenden Daten im Hintergrund in eine Liste arry... Laden und einem Adapter übergeben der sie den anzeigt.
    z.b. Grid in listview. Ich lade auch in einer App Ca 50 Datensätze aus einer SQL und zeige sie in einer listView an , geht recht schnell. Zudem führe ich auch noch Bearbeitungen an den Daten durch bevor ich sie den Adapter übergebe.


    Für die Tabs Monat, Woche, Tag... kannst du dier doch ein festes Layout basteln, und dann nur die Texte ändern.
    Denn den Text tauschen geht schneller als immer die ganze View neu erstellen und zeichnen.
    Oder wilsst du die Tage an denen kein Eintrag ist gar nicht anzeigen. Dann ist eine ListenVariante sinnvoll .
    Sie Ist Performanter und du kannst auch die einzelnen Items anklicken. Wass du bestimmt Später willst.


    Schaue dir doch die RecyclerView mal an erstens soll sie laut Googel Performanter als ListView sein und du kannst recht einfach von Liste zum Grid wechseln.






    Externer Inhalt m.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    vielleicht hilft das.

  • Hallo nochmal,


    ich glaube, dass die LinearLayouts das gar nicht machen, dass es so lange dauert.


    Es ist diese Zeile:


    Code
    events.getCalendarColor(calendarid)


    Dort lese ich die Kalendarfarbe aus der Datenbank. Hmmm.


    Habe es auch mit ListView probiert, das brachte keinen Erfolg. Erst als ich die Kalendarfarbe wegließ, lief es wie geschmiert.


    Edit: Ja, es war diese Zeile. Manchmal muss man die Stecknadel im Heuhaufen suchen :D

  • ok
    Nur wenn du das auslesen aus dem Kalender oder von wo auch immer, erst in eine Liste speicherst, und dann die Liste anzeigen lässt auf welche Art auch immer. Kannst du das eventuelle zeitaufwendige auslesen im Hintergrund laufen lassen. Denn dann greifst nicht mehr auf den ui Fahrrad zu. Das war ja auch deine anfangs frage. Nun gut du hast es ja geschaft. Prima. :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!