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

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

    Hallo,

    ich habe folgenden Code:

    Quellcode

    1. public void addAllEvents(Calendar c1_init_previous2, Calendar c2_init_next) {
    2. Events events = new Events(this.c);
    3. ArrayList<ReadEvent> alldatesmonthly_init_previous = events.getAllEventsByMonth(c1_init_previous2, c2_init_next);
    4. Calendar calen = Calendar.getInstance();
    5. TimeZone tz = calen.getTimeZone();
    6. long calendar_millis = c1_init_previous2.getTimeInMillis();
    7. calendar_millis = ((calendar_millis + tz.getOffset(calendar_millis)) / 1000) * 1000;
    8. for(int i = 0; i < alldatesmonthly_init_previous.size(); i++) {
    9. String eventname = alldatesmonthly_init_previous.get(i).getEventname();
    10. long dtstart = alldatesmonthly_init_previous.get(i).getDtstart();
    11. long difference = (dtstart - calendar_millis) / 1000 / 24 / 60 /60;
    12. if(difference >= 0 && difference < 42) {
    13. long dtend = alldatesmonthly_init_previous.get(i).getDtend();
    14. long calendarid = alldatesmonthly_init_previous.get(i).getCalendarid();
    15. /*if(readevent.getDtstart() < calendar_millis && readevent.getDtend() > calendar_millis) {
    16. readevent.setDtstart(calendar_millis);
    17. }
    18. if((readevent.getDtstart() >= calendar_millis && readevent.getDtstart() < calendar_millis + 86400000) || (readevent.getDtstart() <= calendar_millis && readevent.getDtend() >= calendar_millis + 86400000)) {
    19. */
    20. this.addDate((int)difference, dtstart, dtend, eventname, events.getCalendarColor(calendarid));
    21. }
    22. }
    23. }
    24. private void addDate(int numoflinearlayout, long from, long to, String title, String color) {
    25. Calendar c1 = Calendar.getInstance();
    26. Calendar c2 = Calendar.getInstance();
    27. TimeZone tz = c1.getTimeZone();
    28. TimeZone tz2 = c2.getTimeZone();
    29. from = ((from - tz.getOffset(from)) / 1000) * 1000;
    30. to = ((to - tz2.getOffset(to)) / 1000) * 1000;
    31. c1.setTimeInMillis(from);
    32. c2.setTimeInMillis(to);
    33. showPopup(numoflinearlayout, title, color);
    34. }
    35. private void showPopup(int numoflinearlayout, String title, String color) {
    36. final LinearLayout linearlayout = new LinearLayout(this.c);
    37. final LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    38. layout.setMargins(0, 1, 0, 0);
    39. linearlayout.setLayoutParams(layout);
    40. int color_parsed;
    41. try {
    42. color_parsed = Color.parseColor(color);
    43. } catch(Exception e) {
    44. color_parsed = (0xff000000 + Integer.parseInt(color));
    45. }
    46. //Color.parseColor(color)
    47. linearlayout.setBackgroundColor(color_parsed);
    48. linearlayout.setOrientation(LinearLayout.HORIZONTAL);
    49. final TextView txtview2 = new TextView(this.c);
    50. txtview2.setText(title);
    51. txtview2.setTextSize(11);
    52. txtview2.setSingleLine(false);
    53. final LinearLayout linearlayout3 = new LinearLayout(this.c);
    54. final LinearLayout.LayoutParams layout3 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
    55. linearlayout3.setLayoutParams(layout3);
    56. linearlayout3.setOrientation(LinearLayout.HORIZONTAL);
    57. linearlayout3.addView(txtview2);
    58. linearlayout.addView(linearlayout3);
    59. linearlayouts.get(numoflinearlayout).addView(linearlayout);
    60. }
    Alles anzeigen


    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:

    Quellcode

    1. 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 ?
    Ein Feedback auf Tips ist auch schön. :P
  • jogimuc schrieb:

    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).
    Bilder
    • Screenshot_20170808-175908.png

      170,93 kB, 1.080×1.920, 12 mal angesehen
  • 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 .
    Ein Feedback auf Tips ist auch schön. :P
  • jogimuc schrieb:

    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?


    jogimuc schrieb:

    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.





    vielleicht hilft das.
    Ein Feedback auf Tips ist auch schön. :P

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von jogimuc ()

  • Hallo nochmal,

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

    Es ist diese Zeile:

    Quellcode

    1. 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

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ubik ()

  • 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. :)
    Ein Feedback auf Tips ist auch schön. :P