# GWT: Wie das Ergebnis eines Asynchronen Calls behandeln?



## MartinS (5. Feb 2009)

Hallo,

ich habe mich entschieden, dieses Forum zu wählen, weil GWT in der Java Programmierung ähnlich der andere xWT ist.

Ich möchte in GWT einen Tree mit Daten aus einer Datenbank füllen. Dazu nehme ich einen Asynchronen RPC Call. Ist das der richtige Ansatz?

DataService ist hier als der RemoteService zu sehen und bereits initialisiert. Es wird die Methode vom RemoteService aufgerufen und mit einem AsyncCallback gefüllt. Der AsyncCallback ist eine anonyme Inner Class. getData gibt erstmal nur einen simplen String zurück. Das funktioniert so auch. onSuccess wird aufgerufen und erhält den gewünschten String. Mit dem möchte ich jetzt aber ein TreeItem in den Baum hängen.


```
int id = 5;
dataService.getData(id; new AsyncCallback() {
	
		public void onSuccess(Object result) {
			//TODO
		}
	
		public void onFailure(Throwable caught) {
			//TODO
		}
	});
```

Was mir nicht so klar ist, wie ich das Ergebnis aus der Inner Class schlau in meinen Tree bringe.
Im Prinzip hab ich hier ja einen Listener, so wie einen ClickListener in Oberflächenprogrammierung etc.
Wie reagier ich also auf so einen Event?
Implementiere ich meinen eigenen AsyncCallback und übergebe dem die TreeItems, so dass er sie anfügt?
Oder bau ich mir einen zentralen Controller, den ich dann in der onSuccess Methode aufrufe, der dann den Tree mit den Ergebnissen zusammenbaut?
Oder ganz anders?

Ich freue mich über Tipps, wie ich das angehen sollte.


----------



## byte (5. Feb 2009)

Die Methode onSuccess wird aufgerufen, sobald das Ergebnis vom Server kommt. Die Antwort des Servers (in Form des Rückgabewertes) wird der Methode als Parameter übergeben. Du musst jetzt nichts anderes machen als in der onSuccess das Argument in den richtigen Typ zu casten (ist durch Dein Service-Interface definiert) und damit Deinen Tree zu füllen.



> Oder bau ich mir einen zentralen Controller, den ich dann in der onSuccess Methode aufrufe, der dann den Tree mit den Ergebnissen zusammenbaut?


Genau so würde ich es machen. Du hast einen Controller, der per AsyncCallback Daten vom Server holt. Wenn die Antwort kommt (also in onSuccess) rufst Du eine Methode im Controller auf um die Daten in der View (Deinem Tree) zu aktualisieren.

Hinweis: Wenn Du GWT 1.5 benutzt, dann ist AsyncCallback generisch. Das heisst, Du bekommst direkt den richtigen Rückgabetyp in onSuccess übergeben, den Du im Service-Interface definiert hast.


----------



## MartinS (5. Feb 2009)

Danke Dir!
Der zentrale Controller, der dann den Baum aktualisiert schien mir auch am sinnigsten, aber ich war mir nicht so ganz sicher.

Rest ist klar, wollte es nur übersichtlich halten im Beispiel oben.


----------



## MartinS (5. Feb 2009)

Nachtrag:
Ich habe nun doch selbst noch etwas dazu gefunden:
http://code.google.com/intl/de-DE/d...kit-doc-1-5&t=DevGuideGettingUsedToAsyncCalls

Und fortfolgend das DynaTable Beispiel in den Samples des GWT.


In dem DynaTable Beispiel ist es so, dass es einen sogenannten "acceptor" gibt, der sich um die Verarbeitung der Daten kümmert und sie entsprechend im Table setzt, aber auch alles um den Table herum.


----------



## byte (5. Feb 2009)

In dem Beispiel gehts bloß darum, dass Du den Table schonmal aufbauen kannst, während der Server die Anfrage noch bearbeitet. Wenn die Antwort vom Server kommt, ist der Table im Idealfall schon aufgebaut und Du brauchst nur noch den Inhalt zu setzen. Das spart Zeit.


----------



## Guest (5. Feb 2009)

Ich möchte ja einen Tree bauen.

Ich weiß nicht, wieviel Elemente kommen werden und wie tief der Tree sein wird. Dann kann ich doch auch nicht vorher den Tree aufbauen, oder?

Von daher müsste das doch die passende vorgehensweise sein, nicht wahr?


----------



## byte (5. Feb 2009)

Ich würde Performance-Probleme erst lösen, wenn sich das Problem wirklich stellt (sprich der Seitenaufbau zu langsam ist). Machs also erstmal so.

Bei Trees geht das auch nicht so einfach. Da würde man eher auf LazyTrees umstellen, wenns mit der Performance hapert. Das bedeutet, es wird nicht sofort der gesamte Baum aufgebaut sondern nur der sichtbare Teil (+ evtl. x Hierarchiestufen vorgeladen). Man lädt dann jedes mal die Daten nach, wenn der User den Baum aufklappt.


----------



## MartinS (5. Feb 2009)

Soviele Daten sind es nicht, dass ich einen LazyTree bräuchte, denke ich. 

Ich habe das bereits wie oben angedacht umgesetzt und es läuft gut.
Danke für Deine Tips!


----------

