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

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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




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.

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)

YellowEagle 
Fragesteller
 27.05.2016, 20:36

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

0
AbbathFangirl  27.05.2016, 20:37
@YellowEagle

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.

0
YellowEagle 
Fragesteller
 27.05.2016, 20:39
@AbbathFangirl

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);
}
});
}
}
}
}
0
AbbathFangirl  27.05.2016, 20:46
@YellowEagle

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

Viel Glück noch :-)

0
YellowEagle 
Fragesteller
 27.05.2016, 21:13
@EightSix

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

0

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.

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.

YellowEagle 
Fragesteller
 27.05.2016, 20:37

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

0
androhecker  27.05.2016, 20:43
@YellowEagle

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.

0
androhecker  27.05.2016, 21:18
@YellowEagle

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.

0