return String aus einer callback - Java
weiß jemand wie ich das lösen kann das folgende problem. Ich möchte einen String zurückzugeben, der von einem Rückruf, aber ich bekomme nur "Die Letzte lokale variable s zugewiesen werden kann, da es definiert ist, in einem umschließenden Typ", weil der Letzte.
public String getConstraint(int indexFdg) {
final String s;
AsyncCallback<String> callback = new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
public void onSuccess(String result) {
s = result;
}
};
SpeicherService.Util.getInstance().getConstraint(indexFdg, callback);
return s;
}
AsyncCallback
kein Wert zurückgegeben werden kann. AberCallable<T>
können. In der Regel, was ich tun würde, machen dies zu einemCallable
werden, übergeben Sie es auf eine executor-service, und verwenden Sie die zurückgegebenenFuture<T>
zu bekommen, ist der zurückgegebene Wert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ganzen Punkt ein asynchroner Rückruf ist um Sie zu Benachrichtigen, von etwas, das geschieht asynchron, irgendwann in der Zukunft. Sie können nicht zurück
s
ausgetConstraint
wenn es eingestellt werden nach die Methode ausgeführt hat.Beim Umgang mit asynchronen callbacks müssen Sie überdenken den Ablauf des Programms. Statt
getConstraint
gibt einen Wert zurück, der code, die gehen würde auf, um verwenden, der Wert sollte aufgerufen werden, als ein Ergebnis der Rückruf.Als eine einfache (unvollständiges) Beispiel, würden Sie brauchen, um dies zu ändern:
In etwa wie folgt:
Bearbeiten
Eine beliebte alternative ist das Konzept der Zukunft. Ein future ist ein Objekt, das können Sie sofort zurückkehren, aber das wird nur einen Wert haben, der irgendwann in der Zukunft. Es ist ein container, wo Sie brauchen nur zu warten, bis der Wert an der Stelle von Fragen.
Können Sie denken, halten eine Zukunft als ein ticket für deinen Anzug, der ist bei der trockenen Reinigung. Sie erhalten das ticket sofort, können halten Sie es in Ihrer Brieftasche, geben Sie es einem Freund... aber sobald Sie austauschen müssen Sie für die eigentliche Farbe, die Sie brauchen, zu warten, bis der Anzug fertig ist.
Java hat eine solche Klasse (
Zukunft<V>
), das ist weit von der ExecutorService API.Eine alternative Lösung ist die Definition einer neuen Klasse, genannt
SyncResult
Dann den code ändern, um dies
Den
getResult()
Methode blockiert, bissetResult(String)
Methode aufgerufen wurde oder derTIMEOUT
erreicht.