Methode bei Boolean change neu Ausführen

Zakon

Bekanntes Mitglied
Hallo zusammen, 🙂

Beim öffnen des Programms sind die Werte in einer Tabelle noch nicht definiert. Neben mir habe ich ein NFC Card reader der mit derr javax.smartcardio Librarie läuft.
In dieser Librarie gibt es eine Methode für das CardTerminal ("isCardPresent"). Diese gibt ein True oder False zurück, je nachdem ob eine Karte aufgelegt ist oder nicht.
Meine Frage:
Ist es möglich die Methode, die meine Tabelle befüllt immer neu Auszuführen wenn eine Karte auf das Terminal gelegt wird?

[CODE lang="java" highlight="8"]public void fillData() {
ModelToController modelToController = new ModelToController();
ChipData chipData = new ChipData();

terminal = chipData.getTerminal();

customerData = modelToController.transferCustomerData(chipData.getChipRFID(terminal));
if(terminal.isCardPresent()) {
customerID.setText(customerData.get("ID").toString());
customerLastName.setText(customerData.get("LastName").toString());
customerName.setText(customerData.get("Name").toString());
customerCity.setText(customerData.get("City").toString());
}
//TODO
//Age, Country...
}[/CODE]

In zeile 8 das Statement was den true/false Wert zurück gibt. (An der stelle kein wirklichen Sinn. Der Vollständigkeit jedoch hier reingeschrieben.)
Die fillData() Methode soll jedes mal neu ausgeführt werden wenn sich die Card ändert.

Danke im Vorraus. 🙂
 
Grundsätzlich ist das das klassische Observable Pattern: https://de.wikipedia.org/wiki/Beobachter_(Entwurfsmuster)

Das heißt, im Idealfall registriert man einen Listener am Terminal, der informiert wird, wenn eine Karte da ist und kann darüber das dann entsprechend ausführen. Analog wie z.B. ein ActionListener auf einen Button Druck reagiert. Dafür müsste die Bibliothek aber sowas bereitstellen, da bietet es sich an die Doku bzw. API-Doku zu lesen ob es da z.B. addXXXListener Methoden gibt.

Wenn die Bibliothek es nicht gibt, sehe ich als einzige Möglichkeit einen Thread (hier vermutlich TimerTask) zu starten, der regelmäßig das prüft und dann den Code ausführt. Wie regelmäßig muss man ausprobieren, zu oft belastet vermutlich die Anwendung zu viel.
 
Ok danke dir. Ich lese mich nochmal in die API-Doku ein. Hoffe da gibt es sowas.

Könnte ich mir nich im Notfall dann auch selber so ein Listener bauen?
 
Ah ok verstehe. Danke dir ich mach mich mal schlau und schreibe gegebenfalls nochmal, wenn ich ein Weg gefunden (bzw. entschieden) habe.
 
@mihe7
Danke für deine Antowrt. Ich bin leider mitten in der Klausurphase und hatte deswegen nicht so viel Zeit. 🙂
Die Methode "waitForCardPresent" ist doch aber auch nur eine Methode die ein true oder false zurück gibt. Kann ich mir daraus ein Listener bauen der aktiviert wird wenn diese Methode ein true zurück gibt?
 
Nein, Du kannst keinen Listener bauen, denn das ist nichts asynchrones sondern ein synchroner Aufruf, der so lange blockiert, bis eine Karte da ist oder es auf einen Timeout gelaufen ist.

Wenn Du ein Event haben willst, dann kannst Du also in einem Thread in einer Schleife so lange die Methode aufrufen, bis die Methode true ausgibt. Und dann kannst Du ein Event auslösen oder sonst irgendwas machen.
 
Ok alles klar danke dir. Ich setzte mich heut abend mal dran und poste wie immer meine lösung wenn ich zu einer gekommen bin. 🙂
 
Ich hatte heute mal ein wenig Zeit und bin auch zu einer funktionierenden Lösung gekommen. Falls es jemand brauch so sieht das ganze aus.
Wichtig hier der sleep timer, da sonst der thread losgelaufen ist und die Methode mir tausende Connections zum Terminal hergestellt hat.
[CODE lang="java" highlight="26"]Thread thread = new Thread(){
@Override
public void run() {
while (!thread.isInterrupted()) {
try {
checkCardPresent();
} catch (CardException e) {
e.printStackTrace();
}
}
try {
checkCardPresent();
} catch (CardException e) {
e.printStackTrace();
}
}
};

public void checkCardPresent() throws CardException {
ModelToController modelToController= new ModelToController();
CardTerminal terminal = modelToController.transferCardTerminal();

while (terminal.waitForCardPresent(10)){
fillData(terminal);
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}[/CODE]
 

Zurück
Oben