Frage von YellowEagle, 89

Etwas nur ausführen wenn sich ein boolean ändert (Java)?

Hallo, ich habe eine True Schleife in dieser ist eine Abfrage die abfragt ob ein boolean true oder false ist das Problem ist das sobald der boolean true ist der code der nach der Abfrage kommt hunderttausendmillionen mal ausgeführt wird und das will ich nicht ich will das dieser Code nur einmal ausgeführt wird. Wie kann ich das machen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von MalNachgedacht, 12

boolean static oldStatus=false;

    @Override
public void run(){
while ((true)){ if (status==oldStatus){
                    Thread.sleep(100);
                  } else {
                    oldStatus=status; 

if(STATUS==true){
runOnUiThread(new Runnable() {
@Override
public void run() {
rel.setText("Verbunden!");
b_rel.setEnabled(false);
b_dir.setEnabled(true);
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
b_rel.setEnabled(true);
rel.setText("Konnte nicht verbinden!");
b_dir.setEnabled(false);
}
});
}
}
}
}




Sorry - Formattierung spinnt.
Der Trick ist den vorherigen Status in einer separaten Variable zu speichern und nur wenn der aktuelle Status vom vorherigen Status abweicht etwas zu tun - und dann die Variable des vorherigen Status auf den Wert des aktuellen Status zu setzen




Antwort
von androhecker, 47

Du kannst das Loop beenden mit so einem bestimmen Wort namens break.

Aber jetzt mal im Ernst, wieso so etwas? Außer bei ein paar Ausnahmen wie zB das Erwarten von Clients bei einem Server solltest du keine Endlosschleife benutzten, ich bin mir ziemlich sicher, dass hier Eventbasierte Programmierung effektiver wäre.

Kommentar von YellowEagle ,

Naja wenn ich break benutze dann wird ja die Schleife komplett beendet und es wird nicht mehr auf eine andere Änderung gelauscht :D

Kommentar von androhecker ,

Dann packst du das ganze in eine Methode un führst diese wieder aus, aber wie schon gesagt solltest du das mit einem Event machen, damit erreichst du genau das, was du willst.

Kommentar von YellowEagle ,

Wie mach ich das mit nem Event? :D

Kommentar von androhecker ,

Ich gehe mal stark davon aus, dass du die boolean verändert, dann erstellst du einfach ein Objekt welches eine boolean enthält welche man mit einer Methode setzt. In genau dieser Methode kannst du dann auch noch ausführen was du willst. Wenn man das ganze noch erweitert, indem mehrere EventHandler in einer Liste ausgeführt werden nennt man das ganze dann Eventbasiert.

Antwort
von Tschoo, 17

Hallo!

Habe zwar nicht wirklich dein Problem verstanden, aber der Code siehjt komisch aus

 @Override
public void run(){
while ((!STATUS)){
 runOnUiThread(new Runnable() {...}
} ); /* end while */
runOnUiThread(new Runnable() {
@Override
public void run() {
rel.setText("Verbunden!");
b_rel.setEnabled(false);
b_dir.setEnabled(true);
}
});
}
}
}

Ich würde ihn, erstmal rein optisch, so wie obern umbauen -- und sehen was passiert.

Antwort
von AbbathFangirl, 52

Kannst du deinen Code posten? Dann können wir dir konkret helfen, ansonsten kann ich nur raten, was du falsch machst.


Vorab kann ich dir sagen: Wenn du keine Endlosschleife willst, mach nicht while(true), sondern while(boolean b == false)

Kommentar von YellowEagle ,

Aber wenn dann der boolean b false ist dann wird das qauch solange ausgeführt bis der nicht mehr false ist...

Kommentar von AbbathFangirl ,

Ich dachte, das wolltest du damit erreichen?

Die Schleife prüft, ob der Boolean false ist und solange dieser false ist, wird die Schleife ausgeführt. Erst wenn der Boolean true ist, wird dann eben etwas anderes ausgeführt. Deswegen meinte ich, wäre es besser, wenn du einfach den bestimmten Codeauszug postest.

Kommentar von YellowEagle ,

Nein ich will nur das einmal ausgegeben das die Verbindung verbunden ist sonst öffne ich ja millionen kleinen UI Threads.

Code: 

public class UP_CON implements Runnable {

@Override
public void run(){
while ((true)){
if(STATUS==true){
runOnUiThread(new Runnable() {
@Override
public void run() {
rel.setText("Verbunden!");
b_rel.setEnabled(false);
b_dir.setEnabled(true);
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
b_rel.setEnabled(true);
rel.setText("Konnte nicht verbinden!");
b_dir.setEnabled(false);
}
});
}
}
}
}
Kommentar von AbbathFangirl ,

Ok. Jetzt verstehe ich dein Problem und muss zugeben, dass ich überfragt bin.

Viel Glück noch :-)

Kommentar von YellowEagle ,

Danke ;D

Kommentar von EightSix ,

speicher halt in eine boolean dass es bereits erledigt ist.

Kommentar von YellowEagle ,

Naja aber wenn ich den auf true setzte dann wird der ja dann auch immer wieder ausgeführt :D

Expertenantwort
von KnusperPudding, Community-Experte für Java, 27

Brauchst du wirklich eine Schleife? 

Ich würde dir den Tipp geben: Schau dir mal Observer und Observable an. Sodass du deinen Code nur dann ausführst wenn sich der Wert ändert.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten