German allgemeine Frage zum Programmablauf

kollimann

Member
Licensed User
Hallo, hab eine allgemeine Frage was passiert......

B4X:
Sub Anzeige
for i = 0 to 5
Dim Label1 As Label
Label1.Text = i
next
End Sub

nun wird ja beim Aufruf des Subs das Label erzeugt und dafür ja auch "Ressourcen" im Speicher bereitgestellt.
Wenn ich nun das Sub ein 2. oder 3. oder 4. mal aufrufe, was passiert mit dem Label1 bzw. dessen Ressourcen aus dem 1. Aufruf?
Werden die bei jedem Aufruf neu erzeugt und die "alten" verworfen oder werden die "neu" erzeugt?

.......gesponnen, für Label1 wird 1MB RAM bereitgestellt, wenn ich das Sub 20x aufrufe, sind dann 20MB breitgestellt oder wird das 1MB aus Aufruf 1 immer überschrieben?

Ich hoffe ihr versteht was ich meine.........

Danke Heiko
 

klaus

Expert
Licensed User
Dein Beispiel ist leider zu einfach.
Du definierst jedes mal ein neues Label, aber du zeigst nicht was Du damit machst.
Bevor du einen Text anzeigen kannst musst du das Label auf eine ElterView legen mit
ParentView.AddView(Label1, Left, Top, Width, Height)
Wo machst du das?
Du musst schon genauer erklären was dein Grundproblem ist oder was deine Bedenken sind.
 

kollimann

Member
Licensed User
eigentlich ist es doch völlig Wurscht was ich mit dem Label mache.
Ja man muss das Label in diesem Fall platzieren etc. aber das hab ich alles weggelassen, eben wegen der einfachheit.
Man könnte das Label duch jede beliebige Variable ersetzen um meine Frage zu beantworten.

Dim test as Double
oder
Dim test as Byte

Dim test as Byte besagt doch das Speicherplatz für test reserviert wird, in diesem Fall Größe 1Byte, das die Variable auch einen "Wert bekommen kann"

B4X:
Sub Anzeige
for i = 0 to 5
Dim test As Byte
test = 255
next
End Sub

wenn ich dieses Sub jetzt 1000 mal aufrufe werden also 5000x 1Byte reserviert / mit 255 gefüllt? Oder wird das immer wieder ersetzt?
also irgendwann müsste mein Speicher überlaufen wenn ich diese Sub genügend aufrufe?
 

klaus

Expert
Licensed User
Dim dblTest As Double oder Dim lblTest As Label ist nicht das gleiche.
Double und Label sind verschiedene Objects die nicht gleich behandelt werden, und daher sind die Würste sind nicht die gleichen.
Aber du hast leider nicht meine Frage beantwortet, warum!?
Du musst schon genauer erklären was dein Grundproblem ist oder was deine Bedenken sind.
Was ist dein konkretes Problem ? Denn deine Code Snippets machen, für mich, keinen Sinn.
 

KMatle

Expert
Licensed User
Ich finde die Frage aber legitim. In der Sub sind die Variablen lokal. Wenn du aus der Sub zurückkommst, werden diese durch den Garbagecollector gelöscht.

Ausnahme ist, wenn du z.B. Views einer Activity zuordnest. Dann bleibt das Objekt so lange erhalten, solange die Activity besteht.
 

klaus

Expert
Licensed User
Ausnahme ist, wenn du z.B. Views einer Activity zuordnest. Dann bleibt das Objekt so lange erhalten, solange die Activity besteht.
Das meine ich, anders ausgedrückt, mit Dim dblTest As Double oder Dim lblTest As Label ist nicht das gleiche.
Und irgenwo ein Label zu definieren ohne es einer ParentView zu zuordnen mach für mich keinen Sinn.
 

kollimann

Member
Licensed User
Ok, das volle Programm, ich nutze das hier
https://www.b4x.com/android/forum/threads/another-scrollview-example.8417/#post47107

hab das Layout geändert sonst nichts.
Darin gibt es die Sub FillScrollview, welche die Panels und Labels erzeugt.......

Meine App verabschiedet sich nach x Laufzeit, ohne Fehlermeldung, nur "diese App wurde angehalten"
Ich rufe die Sub FillScrollview alle 2 Sekunden auf. Alles läuft in einer Activity. Also ich komme aus Sub "berechnen" rufe dort am Ende FillScrollview auf und das alle 2 Sekunden ca.
Nun nicht wieder warum alle 2 Sekunden???? Ist so......

Daher mein Gedanke, was passiert wenn man immer die selben Sachen neu deklariert mit Dim.........werden die irgenwann irgendwie gelöscht oder summieren die sich.
 

klaus

Expert
Licensed User
Ich rufe die Sub FillScrollview alle 2 Sekunden auf.
Und warum rufst du FillScrollview alle 2 Sekunden auf?

Im original Programm von dem du sprichst wird FillScrollview nur einmal aufgerufen.
Wenn du das Programm verlässt kümmert sich das Betriebsystem mit dem aufräumen denn die Activity wird auf 'Pause' gestellt und wenn das Betriebsystem Speicher braucht kann Alles zerstört werden. Aber darum brauchst du dich nicht zu kümmern.

Was hast du in dem Programm geändert und was willst du genau machen.
 

KMatle

Expert
Licensed User
Nun nicht wieder warum alle 2 Sekunden???? Ist so......

Sag doch einfach mal, was du genau machen willst und warum du dann alle 2 Sekunden die gleichen Daten aktualisierst. Auch wenn du jetzt vielleicht das irgendwie hinbekommst. Später klappt das dann nicht mehr, der Akku ist ständig leer und die App reagiert träge. Ich Wette (und mein Namesvetter sicher auch), dass dein Vorhaben ganz elegant und einfach ohne Memory-Leaks (= wenn Speicher nicht mehr freigegeben wird) umzusetzen ist.

PS: WhatsApp & Co. machen das auch nicht. So eine App würdest du nach nem halben Tag deinstallieren (die Bewertungen im Store lauten dann: "Die App frisst meinen Akku").
 

kollimann

Member
Licensed User
es geht um Zeitmessung einer "RennApp". jedes mal wenn einer durch Ziel kommt muss die Anzeigeliste ja aktualiesiert werden, es könnte ja einer den anderen überholt haben.
Hab das jetzt anders gelöst, aus unwissenheit meinerseits.
Ich hab jetzt im Desingner meine 8 Panels mit all den Labels für die Anzeigeinfos (Name, Zeit etc) erstellt und fülle nun die Labels mit den entsprechenden Daten. Da gibts kein ständiges Dimm mehr.......
 

KMatle

Expert
Licensed User
es geht um Zeitmessung einer "RennApp"

Auch diese ist ja Event-gesteuert (d.h. jemand fährt über einen Kontrollpunkt/Lichtschranke/Ziel) oder jemand drückt einfach einen Button (o.ä.).

Ich hab jetzt im Desingner meine 8 Panels mit all den Labels für die Anzeigeinfos (Name, Zeit etc) erstellt und fülle nun die Labels mit den entsprechenden Daten. Da gibts kein ständiges Dimm mehr.......

Schon mal ein guter Ansatz. Grundsätzlich trennt man Daten und die Views. Am Anfang komisch, aber wenn die Apps komplexer werden, merkst du schnell, dass das dann doch der einfachere Weg ist.

Einfach eine Liste nehmen und in diese dann alle Teilnehmer als map packen. Gut ist, dass man die ganze Liste mit ein paar Zeilen als Datei speichern kann und wieder laden. Dann einfach alle Elemente (genauer: die Daten) aus der Liste über die maps den Views zuordnen. Ich erzeuge z.B. dann die Views per Programm aus der Liste (10 Teilnehmer = 10 views).
 
Top