Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo mein Problem betrifft eigentlich GWT aber in JAVA SE funktioniert es auch nicht.
Ich bekomme über einen RPC-Aufruf ein Object result übergeben, das ich gern kopieren und wiederverwenden möchte.
In meiner onModuleLoad-methode mache ich folgenden Aufruf.
Java:
...
private DataServiceAsync dataService = GWT.create(DataService.class);
...
private Data resultCopy = new Data(); //copy
public void onModuleLoad() {
...
GridAsyncCallback myCallback = new GridAsyncCallback();
dataService.getData(myCallback);
...
}
Die Klasse GridAsyncCallback sieht so aus und ist eine innere Klasse.
Java:
class GridAsyncCallback
implements AsyncCallback<Data>
{
@Override
public void onFailure(Throwable caught) {
System.out.println(caught.toString());
//TODO handle RPC errors
}
@Override
public void onSuccess(Data result) {
setUpNavPanel(result);
resultCopy = result; // copy result to member??
}
}
Das Data-Object wird auch übertragen, nur bekommen ich eine NullPointerException wenn ich auf
resultCopy zugreife und onSuccess beendet ist. Ich hab auch schon versucht die einzenen member von Data zu kopieren (deep-Copy?). Bei int bekomme ich dann immer "0" und bei String einen "NULL".
Java:
public class Data
implements Serializable
{
...
public Data clone(){
Data cl = new Data();
cl.setStartTime(this.startTime); //start time ist int
cl.setEndTime(this.endTime);
....
return cl;
}
}
gibt es eine möglichkeit result zu kopieren, sodass man es verwenden kann auch wenn onSuccess beendet ist ??.
ich geh davon aus du an einer Stelle versuchst auf das Result zuzugreifen wo der async callback noch gar nicht "da ist", deine Kopie also null ist.
Die restliche Logik wartet nicht bis der Callback zurückgekehrt ist, daher asynchron.
Du könntest versuchen in der onSuccess eien Methode aufzurufen die deine Kopie weiterverarbeitet / erstellt. Da ist sichergestellt dass dein result definitiv da ist
private Data resultCopy = new Data();
public void onSuccess(Data result) {
setUpNavPanel(result);
resultCopy = result; // copy result to member??
}
aber resultCopy (egal, wo ich es deklariere) zeigt auf null sobald, onSuccess verlassen wird. Das gilt auch wenn ich einzelne member von result kopiere (z.B. int ist dann == 0) .
Komischerweise funzt es, wenn ich die member von result in irgendwelche gwt-Elemente einfüge.
z. B.
Java:
private Grid table = new Grid();
public void onSuccess(Data result) {
table.setText(rowId, colId, result.getSomeString());
}
Der String in table bleibt dann erhalten, nachdem onSuccess bendet ist.