ListView Performance bzw. Activity Absturz

  • Antworten:7
Joerg M.
  • Forum-Beiträge: 5

21.07.2015, 17:59:31 via Website

Hallo Leute,

Momentan spiele ich im Rahmen eines kleines Projektes mit der Bluetooth-Kommunikation. Das ganze funktioniert an sich erstmal problemlos.
Allerdings werden in einem Szenario sehr viele unterschiedliche Bluetooth-Nachrichten, unter 'Dauerbeschuss', entgegengenommen. Diese Nachrichten würde ich sehr gerne in einer ListView anzeigen lassen.

Das Problem hierbei ist allerdings, das bei einer so großen Anzahl an eingehenden Nachrichten, die ListView 'hängt' bzw. die Activity in der die ListView enthalten ist gänzlich abstürzt. Ich weiß leider nicht warum, aber wenn dies der Fall ist gibt mit der
'LogCat' im Android-Studio überhaupt keine Fehlermeldung :?

Zunächst habe ich den Standard Android-ArrayAdapter verwendet. Als hier das oben genannte Problem auftrat habe ich das ganze mit einem CustomAdapter versucht - allerdings tritt hier exakt dasselbe Problem auf.

Ebenso habe ich versucht die ListView im 'runOnUiThread' zu aktualisieren, wodurch die Performance allerdings nur minimal besser geworden ist.

runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                message_list.add(inc_message);

                mAdapter.notifyDataSetChanged();


            }
        });

Kennt sich evtl. jemand mit diesem Problem aus und kann Tipps geben wie die Perfomance in diesem Fall gesteigert werden kann? Ich wäre sehr dankbar!

Viele liebe Grüße

Antworten
Sven R.
  • Forum-Beiträge: 1.904

21.07.2015, 19:34:44 via App

Probier das RecyclerView mal aus. Vielleicht solltest du die Daten nur alle 250 ms aktualisieren. Das RecyclerView hat einen eigenen notifyDataSetChanged() für das Hinzufügen von Elementen. Das sollte schon mal helfen.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Joerg M.
  • Forum-Beiträge: 5

22.07.2015, 08:11:27 via Website

Hallo Sven.

Vielen Dank für den Tipp, ich werde es im Laufe des Tages mal ausprobieren und hier Rückmeldung geben.

Viele Grüße

Antworten
Joerg M.
  • Forum-Beiträge: 5

22.07.2015, 19:20:07 via Website

Hallo Leute,

Ich habe den Tipp von Sven versucht, leider ohne Erfolg. Die ListView hakt beim Scrollen wie eh und je.

Ich denke das Problem ist folgendes: Die App empfängt permanent Daten via Bluetooth (mehrere Hundert/s), welche ich versuche direkt in die ListView zu packen. Hierzu rufe ich nach jedem empfangenen Datensatz die notifyDataSetChanged-Methode meines Custom-Adapters auf.

Ich denke dieser, beinahe permante Aufruf der notifyDataSetChanged-Methode dazu führt das die Performance so stark in den Keller geht.
Ich habe schon versucht die ListView nur nach jedem 20ten Eintrag zu aktualisieren, allerdings kam dort folgende Fehlermeldung zu stande: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread

Ich weiß gerade leider nicht mehr weiter und wüsste gern eure Meinung bzw. eure Tipps hierzu.

Vielen Dank !

Viele Grüße

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

22.07.2015, 19:56:59 via App

Ist es denn nöfitg dass du per Bluetooth so viele auf einmal bekommst? Aknnst du die nicht irgendwie auf der gegenstelle zusammenfassen. Zudem mehrere Hundert pro Sekunde kann man ja niemals lesen also bingt das im endeffekt nicht viel.

Zudem kannst du auch in der app nur in einem Zeitintervall von 1. s aktualisieren. Sobald da 100 Eintäge drin sind brauchst du die Zeit schon zum Scrollen.

Und du kannst ja einfach alles in die ArrayList hinzufügen und dann später aktualisieren. Oder ist es wichtig dass es echtzeit ist obwohl man das in echtzeit niemals lesen kann?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Joerg M.
  • Forum-Beiträge: 5

22.07.2015, 20:11:10 via Website

Hey Pascal,

Vielen Dank für deine Antwort.

Nein in Echtzeit soll man das natürlich nicht lesen können ;)
Viel mehr geht es darum im Nachhinein die Daten 'Überblicken' & Auswerten zu können, aber das ist eine ganz andere Geschichte.

Ich könnte sehr gut damit leben die ListView zu einem späteren Zeitpunkt zu aktualisieren, allerdings funktioniert das ganze nicht so einfach (s.o.).
Die empfangenen Nachrichten landen momentan in einer ArrayList, welche wiederrum die ListView 'füllt'. Wenn ich nun die notifyDataSetChanged-Methode NICHT nach jedem neuen Eintrag aktualisere, so crashed die App und der/die LogCat spuckt folgende Meldung raus : java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

Jemand eine Idee?

Vielen Dank & Viele Grüße

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.07.2015, 08:00:46 via App

Dann brauchst du 2 listen. Eine in die du immer Daten einfüllst und die andere die dann für die Liste ist. und immer wenn du die ListView aktualisieren willst, dann musst du die Daten von der Daten Liste in die Liste der ListView übernehmen. und dann halt sagen dass sich was geändert hat

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Sven R.
  • Forum-Beiträge: 1.904

23.07.2015, 09:11:19 via App

Besser wäre beim RecyclerView zu sagen, was sich geändert hat. Also von Länge der alten Liste -1 bis zur Länge der neuen Liste -1.
Ich meinte das weiter oben auch wie Pascal, die Daten des RecyclerViews nur alle 250ms aktualisieren. Das sollte reichen. Mit aktualisieren meine ich nicht nur notify...(), sondern auch das wirkliche Hinzufügen von den Daten in das RecyclerView. Also die einkommenden Daten in einer temporären Liste buffern. Nach dem Hinzufügen mit List#addAll() oder so kannst du die Buffer Liste clearen.

— geändert am 23.07.2015, 09:14:19

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten